Announcement Announcement Module
Collapse
No announcement yet.
Spring-Dojo.js an implementation query Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spring-Dojo.js an implementation query

    When an ajax response is processed in "handleResponse" - code snippet below

    Code:
    	handleResponse: function(response, ioArgs) {
    
    ...
    ...
    		//Extract and store all <script> elements from the response
    		var scriptPattern = '(?:<script(.|[\n|\r])*?>)((\n|\r|.)*?)(?:<\/script>)';
    		var extractedScriptNodes = [];
    		var matchAll = new RegExp(scriptPattern, 'img');
    		var matchOne = new RegExp(scriptPattern, 'im');
    	
    		var scriptNodes = response.match(matchAll);
    		if (scriptNodes != null)
    		{
    			for (var i=0; i<scriptNodes.length; i++)
    			{
    				var script = (scriptNodes[i].match(matchOne) || ['','',''])[2];
    				script = script.replace(/<!--/mg,'').replace(/\/\/-->/mg,'').replace(/<!\[CDATA\[(\/\/>)*/mg,'').replace(/(<!)*\]\]>/mg,'');
    				extractedScriptNodes.push(script);
    			}
    		}
    		// Remove scripts but don't remove scripts entirely (see SWF-1358) 
    		response = response.replace(matchAll, '<script> // Original script removed to avoid re-execution </script>');
    
    		if (modalView) {
    			//For a modal view, just dump the response into a modal dialog
    			Spring.remoting._renderResponseToModalDialog(response);
    		} else {
    			//Extract the new DOM nodes from the response
    			var tempSpan = dojo.doc.createElement("span");
    			tempSpan.id="ajaxResponse";
    			tempSpan.style.display= "none";
    			document.body.appendChild(tempSpan);
    			tempSpan.innerHTML=response;
    			var tempContainer = new dojo.NodeList(tempSpan);
    			var newNodes = tempContainer.query(">").orphan();
    			tempContainer.orphan();
    			
    			//Insert the new DOM nodes and update the Form's action URL
    			newNodes.forEach(function(item){
    				if (item.id != null && item.id != "") {
    					var target = dijit.byId(item.id) ? dijit.byId(item.id).domNode : dojo.byId(item.id);
    					if (!target) {
    						console.error("An existing DOM elment with id '" + item.id + "' could not be found for replacement.");
    					} else {
    						target.parentNode.replaceChild(item, target);
    					}
    				}
    			});
    		}
    		
    		//Evaluate any script code
    		dojo.forEach(extractedScriptNodes, function(script){
    			dojo.eval(script);
    		});
    		
    		return response;
    ..can someone explain why the inline <script> tags are extracted (and basically removed) from the html fragment and the html fragments added to a temp dom element before being inserted into the html page, and then the extracted inline scripts are then evaluated?

    I'm guessing some browsers do not execute inline scripts when added dynamically via javascript?

    But why is temp dom created? Why not add straight in the html page in the relevant place?
Working...
X