2013-05-29 1 views
0

Я работаю над плагином, который позволяет вставлять сторонний код на страницу (либо как iframe, либо непосредственно в DOM).Как определить, был ли загружен плагин или скрипт без использования eval() или requireJS?

Моя проблема - «прямые инъекции», потому что мне нужно убедиться, что я не добавляю никаких сценариев < > дополнительных времен, если они необходимы на моей главной странице и на странице, которую я загружаю и впрыскиваю.

Например (и я не могу использовать requireJS), мой page.html выглядит следующим образом:

<html> 
    <head> 
    <script type="text/js" src="jquery.js"></script> // exports window.$ 
    <script type="text/js" src="foo.js"></script> // exports window.foo 
    </head> 
    <body> 
    <!-- things that make foo load anotherPage.html and append its content here --> 
    </body> 
</html> 

с anotherPage.html

<html> 
    <head> 
    <script type="text/js" src="foo.js"></script> // exports window.foo 
    </head> 
    <body> 
    <!-- stuff that also runs on FOO --> 
    </body> 
</html> 

загрузка страниц осуществляется с помощью Ajax и когда я обработки data, возвращенный моей просьбой для anotherPage.html После этого я приведу список всех элементов:

cleanedString = ajaxResponseData 
     .replace(priv.removeJSComments, "") 
     .replace(priv.removeHTMLComments,"") 
     .replace(priv.removeLineBreaks, "") 
     .replace(priv.removeWhiteSpace, " ") 
     .replace(priv.removeWhiteSpaceBetweenElements, "><"); 
    // this will return a list with head and body elements 
    // e.g. [meta, title, link, p, div, script.foo] 
    content = $.parseHTML(cleanedString, true); 
    // insert into DOM 
    someTarget.append(content); 

Здесь я застреваю, пытаясь определить, есть ли сценарий, который я собираюсь добавить в документ, уже есть.

Я не могу пойти по src, так как имя файла может отличаться, и скрипт может быть размещен в другом домене (с правильно установленным Access-Control-Allow-Origin). Я также не знаю, что и если скрипт, который я собираюсь добавить, возвращает глобальное я уже определил, и я не могу/не хочу/не хочу использовать eval(), чтобы узнать.

Вопрос:
Есть ли способ, чтобы определить, является ли плагин или скрипт, который может вернуть глобальный уже «на» странице, когда у меня только «не прилагаемую» < скрипта > элемента доступного?

Спасибо!

+0

if (self. $ && self.foo) {do stuff; } – dandavis

+0

hm. звучит слишком просто. Дай мне попробовать. – frequent

+0

вы можете даже заставить его ждать: (функция wait() {if (! Self. $) {Return setTimeout (wait, 100);}; do Stuff()}()); – dandavis

ответ

1

вот пример моей замкнуты шаблон модуля, я называю это «Страж»:

(function wait(){ 

    if(!self.$){ 
     if(!wait.waitingJQ){ 
      wait.waitingJQ=true; 
      addScriptTag(JQUERY_URL); 
     } 
     return setTimeout(wait, 44); 
    } 

    doStuffThatNeedsJquery(); 

}()); 

сторожевого шаблон работы из любой точки (внутренний или внешний), не заботится о загрузке сценария порядок и работает с ЛЮБОЙ загрузкой библиотеки скриптов. вы можете перечислить дополнительные данные, зависящие от вилки jQuery, таким же образом, просто поместите свой жадный код в нижней части оболочки-оболочки.

+0

спасибо. см. мой комментарий выше. – frequent

+0

re: cmt. да, вам нужно курить пистолет из каждого файла сценария, чтобы использовать это. так как вы намекаете на каждый сценарий, который зависит от вас, вы должны иметь возможность получать/обманывать эту зависимость со своей страницы. В худшем случае вы можете добавить курящее пистолет в собственный файл сценария для полувидимых скриптов, таких как полисы. – dandavis

Смежные вопросы