innerHTML для вставки скрипта в тело (для ZeroClipboard) не работает - PullRequest
0 голосов
/ 27 февраля 2012

Я создаю <div> элементы, используя AJAX, и я хочу добавить функциональность ZeroClipboard.Firebug показывает, что код создается правильно, и когда я копирую его в тестовую HTML-страницу, он тоже работает.Сборки не выполняются при загрузке, но в нужном направлении.

Код выглядит следующим образом, вызывая некоторые функции, создающие новые элементы:

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 базового элемента.Это может быть ненужным, если я смогу заставить работать вспышку.

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Вы можете просто вставить свой скрипт на страницу как объект 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 голосов
/ 14 декабря 2013

Вот метод, который рекурсивно заменяет все скрипты исполняемыми:

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";         
}                                                                                                                                                                                                                                                                         
...