#javascript
#javascript
Вопрос:
Я пытаюсь создать букмарклет, который сначала проверяет наличие jQuery на странице и загружает библиотеку, если необходимо, перед загрузкой моего пользовательского скрипта. Скрипт выглядит следующим образом:
javascript:(function() {
function loadMyScript() {
var my_src = document.createElement('script');
my_src.src='url_of_my_script';
document.body.appendChild(my_src);
}
function loadJQuery() {
var otherlib = false;
if (typeof $ === 'function') {
otherlib = true;
}
function getScript(url, success) {
var script = document.createElement('script');
script.src = url;
script.onload = success;
document.body.appendChild(script);
if (otherlib) {
jQuery.noConflict();
}
}
getScript('http://code.jquery.com/jquery-latest.min.js', loadMyScript);
}
if (typeof jQuery === 'undefined') {
loadJQuery();
} else {
loadMyScript();
}
})();
Помещая этот код в bookmarket в Firefox 4, я получаю «отсутствует } после тела функции», когда пытаюсь его запустить. Однако выполнение того же кода в консоли Firebug завершается успешно. Chrome выдает аналогичные результаты; букмарклет выдает «Неожиданное завершение ввода», в то время как выполнение кода в консоли завершается успешно.
Кто-нибудь знает, что здесь происходит?
(В стороне: функция getScript несколько неполна. Я просто вырвал несколько вещей, чтобы попытаться решить эту синтаксическую проблему)
Комментарии:
1. Я уверен, что это не проблема, но у вас нет точки с запятой после
my_src.src='url_of_my_script'
. Я бы исправил это просто для согласованности 🙂2. Это ведущее «javascript:» не нужно. редактировать о, подождите, за исключением этого чрезвычайно важного слова » букмарклет » в вашем вопросе 🙂 Извините за это; неважно.
Ответ №1:
my_src.src = 'url_of_my_script'
В этой строке отсутствует точка с запятой. Это была единственная ошибка, которую я получил.
Комментарии:
1. Упс, убрал это, когда вставлял и редактировал код. Вставляю его обратно. Проблема по-прежнему сохраняется.
Ответ №2:
Когда вы делаете букмарклеты…
Используйте комментарии в стиле блоков вместо однострочных комментариев
function () {
/*Right:*/
return 0;
//Wrong:
return 0;
}
После переноса в однострочный код букмарклета приведенное выше становится:
function () { /*Right:*/ return 0; //Wrong: return 0; }
Проверьте, нет ли пропущенных точек с запятой
Пропущенные точки с запятой допустимы до тех пор, пока за ними не следует оператор. Для простоты лучше всегда использовать их в букмарклете.
function () {
/*Right:*/
var a = 0;
/*Wrong:*/
a = 0
/*Doesn't matter:*/
a = 0
}
Вышесказанное становится:
function () { /*Right:*/ var a = 0; /*Wrong:*/ a = 0 /*Doesn't matter:*/ a = 0 }
Комментарии:
1. Для меня это тоже был однострочный комментарий. Хороший ответ, потому что на рассматриваемый код это не влияет, но это обычная ошибка.
Ответ №3:
Попробуйте переместить круглые скобки вызова внутрь круглых скобок, которые закрывают функцию.
Вот так:
(function(){
// do stuff
}())
Ответ №4:
У меня была похожая проблема — странная ошибка Javascript в самом базовом фрагменте кода. Еще более странным было то, что код отлично работал локально (Win7), но не запускался на моем сервере (Ubuntu).
По наитию я скопировал текст внутри файла .js и вставил в другой текстовый редактор (TextPad), отличный от моей IDE (NetBeans), и сохранил файл. На этот раз, когда я загрузил файл, ошибки Javascript не было.
По какой-то причине в исходном файле удалялись разрывы строк.
Ответ №5:
Я думаю, что проблема в первой строке :
javascript:(function() {
здесь у вас есть два варианта :
даже если вы находитесь на объекте и делаете что-то вроде :
var myobj = {
javascript: function () {
// code here
}
}
или вы создаете функцию :
var func_name = function () {
// code here
}
или, в конечном итоге, что-то вроде этого :
;(function($) {func_name = function (sBind, oFunction) {
// code here
}})();
Ответ №6:
В конце следующей строки не хватает точки с запятой:
my_src.src='url_of_my_script'
Ответ №7:
Внутренняя функция, определенная в loadJQuery, сбивала с толку. Я изменил все примерно так:
javascript:(function() {
function loadMyScript() {
var my_src = document.createElement('script');
my_src.src = 'url_of_my_script';
document.body.appendChild(my_src);
}
function getScript(url, success) { // <- moved this function outside loadJQuery
var script = document.createElement('script');
script.src = url;
script.onload = success;
document.body.appendChild(script);
}
function loadJQuery() {
var otherlib = false;
if (typeof $ === 'function') {
otherlib = true;
}
getScript('http://code.jquery.com/jquery-latest.min.js', function() {
if (otherlib) {
jQuery.noConflict();
}
loadMyScript();
});
}
if (typeof jQuery === 'undefined') {
loadJQuery();
} else {
loadMyScript();
}
})();
Это ново для меня. Не разрешены ли вложенные функции в букмарклетах? Я еще не видел никакой документации по этому поводу.