JSLint и Bookmarklets - PullRequest
       26

JSLint и Bookmarklets

13 голосов
/ 01 ноября 2011

Я бегу JSLint проверяет Rhino , используя jslintant.js .

Я нашел что-то немного странное, и мне было интересно, смогу ли я получить какой-то вклад от других программистов. По сути, следующая строка получает JSLint 'Script URL' error:

var a = '<a href="javascript:alert(\'I am a bookmarklet\');" >Drag me to your Toolbar</a>';

Ошибка:

Lint at line 124 character 35: Script URL.

Я изучил код, который Дуглас Крокфорд написал в fulljslint.js , и обнаружил, что он действительно проверяет это следующим образом:

// javascript url
jx = /(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i,

Итак, с учетом этого ограничения и того факта, что перетаскивание букмарклетов использует только атрибут HREF тега A. Как мы должны динамически создавать букмарклеты, которые проходят тест JSLint?

Спасибо за ваш вклад.

Ответы [ 2 ]

16 голосов
/ 01 ноября 2011

JSLint может быть слишком разборчивым время от времени. В этом случае я бы предложил попробовать обойти. Следующие два обходят тест регулярного выражения, разбивая строку на более мелкие части:

var x = ['<a href="javascript', ':', 'stuff'].join('');

или

var tmp = '<a href="javascript'
var x = tmp + ':stuff"';

К сожалению, вы не можете просто конкатенировать строковые литералы с + (как предлагалось в старой версии этого ответа), потому что в новых версиях JSLint добавлен специальный код для обнаружения этого:

var x = 'javascript' + ':' + 'stuff'; // JSLint might still give a warning here.

Редактировать: Если вы используете JSHint вместо JSLint, вы можете установить опцию «scripturl» для подавления этого класса предупреждений без необходимости использования обходного пути:

/*jshint scripturl:true*/
var x = 'javascript: foo()';
0 голосов
/ 12 декабря 2014

Я тоже столкнулся с этой проблемой, как кто-то предложил, прежде чем вы сможете разбить его на части, чтобы обойти предупреждение, но

var x = 'javascript' + ':';

не сработает.Более простой способ, чем предложенный ранее метод:

var x = 'javascript' + ':'.toLowerCase() + 'alert("my action")';
...