2012-02-27 51 views
0

我正在构建使用AJAX的<div>元素,并且我想添加ZeroClipboard功能。 Firebug显示代码构建正确,当我将它复制到原始HTML测试页面时,它也可以工作。这些构建不是在onload上发生,而是在赛道上。innerHTML在主体中插入脚本(对于ZeroClipboard)不起作用

的代码如下,调用,创造了新的元素一些功能:

dom_append_child_with_onclick ("img",export_id,"icon_active",report_heading_id, "event.cancelBubble = true;"); 
dom_append_child ("div",export_script_id,"",report_heading_id); 
text = "<script language='JavaScript'>var clip" +rnum +"=new ZeroClipboard.Client();clip"+rnum+".setText('');clip"+rnum+".addEventListener('mouseDown',function(client){alert('firing');clip"+rnum+".setText(document.getElementById('SL40').value);});clip"+rnum+".glue('XR"+rnum+"','RH"+rnum+"');</script>"; 
document.getElementById(export_script_id).innerHTML=text; 

我的问题:当您插入脚本到<body>,你必须做一些事情来得到它的火?该脚本似乎没有做它的事情,我不能得到警报“解雇”显示。

注意:cancelBubble是停止底层元素的onClick函数。如果我能够使闪光灯工作,可能没有必要。

谢谢。

回答

1

您可以直接注入脚本到页面的DOM对象,但是这并不在所有的浏览器:

var s = document.createElement("script"); 
s.type = "text/javascript"; 
s.innerText = "var clip" +rnum +"=new ZeroClipboard.Client();clip"+rnum+".setText('');clip"+rnum+".addEventListener('mouseDown',function(client){alert('firing');clip"+rnum+".setText(document.getElementById('SL40').value);});clip"+rnum+".glue('XR"+rnum+"','RH"+rnum+"');"; 
document.getElementsByTagName("head")[0].appendChild(s); 

或者,为了更好的兼容性,你可能只想宣布,其设定的功能这在你的页面中,然后以rnum作为参数调用函数。

例如

function useZeroClipboard(rnum) { 
    window["clip" + rnum] = new ZeroClipboard.Client(); 
    cwindow["clip" + rnum].setText(''); 
    window["clip" + rnum].addEventListener('mouseDown', function(client){ 
     alert('firing'); 
     window["clip" + rnum].setText(document.getElementById('SL40').value); 
    }); 
    window["clip" + rnum].glue('XR"+rnum+"','RH"+rnum+"'); 
} 

然后,你可以调用你的代码:

useZeroClipboard(rnum); 

而是写剧本块。

+0

感谢这一点,亚当。我已经稳步地认识到我所问过的错误问题。它慢慢地让我意识到,从已经运行的脚本插入脚本(使用innerHTML)没有意义,并且可以做我需要做的事情。实际上,我的解决方案一直是按照你的功能想法所建议的。我创建了一个全局数组o,然后使用o [rnum] = new ZeroClipboard.Client();等等在我的解决方案中使用window [“clip”+ rnum]会有好处吗? – Nick 2012-02-27 10:33:52

+0

不,你的新解决方案更好(比编号的全局变量更容易使用数组!) – 2012-02-28 01:19:14

+0

谢谢,亚当。 --- – Nick 2012-02-28 06:21:21

0

这里是一个递归地执行替换原有的所有脚本的方法:

function replaceScriptsRecurse(node) {              
     if (nodeScriptIs(node)) {               
       var script = document.createElement("script");        
       script.text = node.innerHTML;            

       node.parentNode.replaceChild(script, node);         
     }                     
     else {                    
       var i  = 0;               
       var children = node.childNodes;            
       while (i < children.length) {            
         replaceScriptsRecurse(children[i]);        
         i++;                 
       }                   
     }                     

     return node;                   
}                       
function nodeScriptIs(node) {                
     return node.getAttribute && node.getAttribute("type") == "text/javascript";   
}