Как динамически добавить тег сценария в пользовательский элемент управления asp.net? - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть пользовательский контроль (myUserControl.ascx).тем, что я пытаюсь добавить тег сценария и назначить динамически «src», а затем проверять события onload и onerror, но, похоже, это не работает.

Ответы [ 2 ]

1 голос
/ 09 февраля 2012
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", "url to the script file here");
document.getElementsByTagName("head")[0].appendChild(script);

Я искал "onload" со сценариями раньше, я не помню, чтобы найти такое событие.В итоге я написал js-код на основе таймера, чтобы часто проверять объект, который, как ожидается, будет определен в загружаемом скрипте.Таким образом, это либо то, что вы делаете, либо: почему бы просто не сделать ничего из кода, который вставил тег сценария - вместо этого у вас есть идеально синхронизированный момент, когда ваш сценарий готов: добавьте «развернутый» код в сам сценарий(например, alert("I, the script, loaded and I'm ready with these functions that I provide");.

И здесь нет случая «при ошибке»: скрипт будет либо загружаться, либо нет (по любой причине: недоступность, подключение, ошибка сервера и т. д.). Еслион [загружает], любые ошибки, которые могут возникнуть во время выполнения / использования скрипта, не связаны с транспортом (эти ошибки должны обрабатываться так же, как вы обрабатываете любую другую ошибку скрипта), так что ваше намерение - "onerror"здесь не подходит (IMO). +1:)

РЕДАКТИРОВАТЬ: Если он не загружается, то он не будет выполняться, и вы не сможете его использовать.Если ваш клиентский код действительно ожидает, вам придется написать какую-то логику тайм-аута на основе таймера;например, после строки «add to head» выше сделайте что-то вроде этого:

window.setTimeout(function()
{
    // object/variable "newScriptObject" is defined in the new script
    if(!newScript)
    {
        // script timed out; let's proceed with plan B
    }
    else
    {
        // script ready, proceed as planned;
        // although, like I said, I think it's more precise if you execute this code in your myscript.js instead - as maybe that code will be ready before the 5 sec assumed here
        // alternatively, use window.setInterval to check for objects defined this script every so milliseconds, in which case, when you find the script, don't forget to stop that timer (window.clearInterval)
    }
}, 5000); // wait 5 sec for the new script

Наконец, в этом контексте не существует такой вещи, как «частичная загрузка». AВменяемый браузер не начнет выполнять скрипт, который не был полностью, не только загружен, но и проанализирован (интерпретирован).«Интерпретируемая» часть - это то, почему вы будете видеть ошибки JS, которые часто указывают на несвязанное местоположение, когда вы пропускаете скобку где-то или из-за других синтаксических ошибок.По крайней мере, пропущенная фигурная скобка относится к этой категории, поскольку такая синтаксическая ошибка практически полностью «сдвигает» (вроде) блоки кода, делая невозможным выяснение, что к чему.Извините за то, что вы здесь немного не по теме.

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

Добавьте ваш вновь созданный тег в документ:

document.getElementsByTagName('head')[0].appendChild(scriptGoogle);
...