Как добавить внешний файл javascript и запустить функцию через букмарклет?

Привет, я пытаюсь создать букмарклет javascript, который добавит ссылку на внешний источник javascript на страницу, которая находится вне домена. Однако ничего не происходит, когда я запускаю букмарклет без ошибок, и код на странице никогда не меняется. Есть идеи? Вот букмарклет, который я пытаюсь использовать. Спасибо за ваше время.

javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://mycode.com/autopopulator.js';autopopulate();})(); 

person NCX001    schedule 10.10.2010    source источник
comment
Вероятно, вы правильно добавляете тег сценария. Я подозреваю, что проблема в том, что вам нужно подождать, пока браузер загрузит скрипт, прежде чем этот вызов функции сможет работать.   -  person Pointy    schedule 11.10.2010


Ответы (3)


Вы также можете добиться этого с помощью обратного вызова:

    var addScript=function(filename,callback){
            var e=document.createElement('script');
            e.type = 'text/javascript';
            e.src = filename;
            if(callback){
                e.onloadDone=false;//for Opera
                e.onload=function(){e.onloadDone=true;callback();};
                e.onReadystatechange=function(){
                    if(e.readyState==='loaded'&& !e.onloadDone){
                        e.onloadDone=true;callback();
                    }
                }
            }
        if(typeof(e)!=='undefined'){
            document.getElementsByTagName('head')[0].appendChild(e);
        }
    }
addScript('http://yoursite.com/js/yourScript.js',function(){functionFromYourScript();});

(конечно, вы захотите оптимизировать это, чтобы втиснуть его в букмарклет, но вы поняли идею...)

person Adam Napalm    schedule 30.11.2010
comment
хех, оказывается, это было нужно мне самому, так что вот сжатая версия (вам просто нужно добавить вызов функции с обратным вызовом в конец этого) javascript:var www=function(f,c){var e=document.createElement( script); e.type=text/javascript;e.src=f;if(typeof(e)!==undefined){if(c){e.onloadDone=false;e.onload=function(){e. onloadDone=true;c()};e.onReadystatechange=function(){if(e.readyState===loaded&&!e.onloadDone){e.onloadDone=true;c(e.innerHTML)}}}document.getElementsByTagName (голова)[0].appendChild(e)}}; - person Adam Napalm; 30.11.2010

Я никогда не пытался создать букмарклет. Но я нашел этот пример в Интернете, который включает jQuery, который может быть вам полезен.

http://www.latentmotion.com/how-to-create-a-jquery-bookmarklet/

В нем объясняется, как ссылаться на внешние файлы JS и включать в них другие файлы, но я думаю, что вы ищете следующее:

<a href="javascript:(function(){var head=document.getElementsByTagName('head')[0],script=document.createElement('script');script.type='text/javascript';script.src='http://www.site.com/your-javascript.js?' + Math.floor(Math.random()*99999);head.appendChild(script);})(); void 0">Your Bookmarklet Name</a>
person Malachi    schedule 10.10.2010
comment
Это все еще не показывает никаких изменений. Как будто он вообще ничего не меняет на странице. - person NCX001; 11.10.2010

Вам нужно добавить код, который

  1. вставляет необходимые теги сценария, а затем
  2. используйте интервал таймера для повторной проверки объекта из импортированного скрипта

Вот пример кода:

function writeTags(){
    //write the script tags
}
function check(){
    // example for prototype library
    if(window.Prototype && Prototype.Version){
        doActualWork();
    }else{
        window.setTimeout(check, 200);
    }
}
function doActualWork(){
    // this your actual code that requires
    // the loaded library
}
writeTags();
check();
person Sean Patrick Floyd    schedule 10.10.2010
comment
Мне любопытно, чего я достигну, проверив объект из скрипта? - person NCX001; 14.10.2010
comment
если вы найдете объект, вы знаете, что скрипт загружен, и вы можете использовать его методы. это обычная проверка в JavaScript при работе с библиотеками - person Sean Patrick Floyd; 14.10.2010