2013-03-31 2 views
4

Я пытаюсь написать букмарклет, который добавляет JSONP вызова на страницу, как это:Вызов функции созданной внутри букмарклета

javascript:(function(){ 
var myFunction = (window.function(data){alert('my function is firing with arg' + data)}); 
var j = 'http://localhost/jsonscript.js'; 
var s = document.createElement('script'); 
s.src = j; 
document.getElementsByTagName('head')[0].appendChild(s); 
})(); 

где ЦСИ скрипт добавляется на страницу содержит

myFunction('foo'); 

Но есть ошибка, когда я нажимаю букмарклет - myFunction не определен. Как я могу «экспортировать» эту функцию за пределы моего букмарклета, чтобы при вызове из добавленного тега скрипта он работал?

Редактировать: Я понял, что могу просто упаковать внутренний HTML-элемент скрипта с необработанным JavaScript. Это работает, но это уродливо. Я все равно хотел бы найти лучший способ.

+2

туРипсЫоп вар сфера находится в букмарклет , поэтому вы можете объявить его глобальным, если хотите получить к нему доступ за пределами (function() {})(). Изменить var myFunction = ... to window.myFunction = – elmasse

+0

Попробуй это, спасибо. – AmbroseChapel

+0

Работает нормально. Положите это как ответ, и я сделаю это правильно. – AmbroseChapel

ответ

4

Определим функцию на окне объекта:

window.myFunction = ... 

С JSONP запросов, вы обычно хотите некоторый тип счетчика для увеличения, а именно:

var counter = 1; 
var myFuncName = "myFunction" + counter; 
var j = 'http://localhost/jsonscript.js?callback=' + myFuncName; 
window[myFuncName] = function (data) {...}; 

// remove function after timeout expires 
setTimeout(function() { delete window[myFuncName] }, 5000);