Почему этот код JS букмарклета не работает, когда он помещен в обработчик onclick? - PullRequest
0 голосов
/ 14 мая 2009

У меня довольно типичный код букмарклета, который отлично работает для меня во всех браузерах. Однако когда я беру этот код и помещаю его в обработчик элемента HTML onClick, он не работает в IE (6, 7 или 8).

Это код:

javascript: (
    function(){
        function l(i,u){
            var d=document;
            var s;
            try{
                s=d.standardCreateElement('script');
            }catch(e){}
            if(typeof(s)!='object')
                s=d.createElement('script');
            try{
                s.type='text/javascript';
                s.src='http://{Domain}/bk/' + u;
                s.id='s_' + i;
                d.getElementsByTagName('head')[0].appendChild(s);
            }catch(e){
            }
        }
        AppD = '{Domain}';          
        l('b', 'bk.js');
    }   
    )();

Сжатый как букмарклет, который выглядит как:

javascript:function(){function l(i,u){var d=document;var s;try{s=d.standardCreateElement('script');}catch(e){} if(typeof(s)!='object')  s=d.createElement('script'); try{s.type='text/javascript';s.src='http://{Domain}/bk/' + u;s.id='s_' + i;d.getElementsByTagName('head')[0].appendChild(s);}catch(e){}}AppD = '{Domain}';l('b', 'bk.js');})();

И это прекрасно работает. Я вынул префикс javascript: и поместил его в элемент onClick:

<img onclick="function(){function l(i,u){var d=document;var s;try{s=d.standardCreateElement('script');}catch(e){} if(typeof(s)!='object')   s=d.createElement('script'); try{s.type='text/javascript';s.src='http://{Domain}/bk/' + u;s.id='s_' + i;d.getElementsByTagName('head')[0].appendChild(s);}catch(e){}}AppD = '{Domain}';l('b', 'bk.js');})();" />

И это тоже хорошо работает, за исключением того, что в IE код внутри bk.js (скрипт, который вводится) жалуется, что переменная AppD не определена ...

Есть идеи, почему это происходит?
Есть ли какие-либо ограничения в коде, который можно поместить в обработчик onClick?

Спасибо! Daniel

1 Ответ

1 голос
/ 14 мая 2009

Решено добавлением window.AppD перед объявлением переменной.

Решение, предоставленное Эндрю Нойесом в другом вопросе:

Существуют ли какие-либо ограничения на то, что можно сделать в встроенном обработчике onclick?

...