Как изменить этот Javascript для открытия ссылок в другом окне? - PullRequest
1 голос
/ 14 марта 2012

Этот Javascript, который я нашел здесь добавляет метод parseURL () к строковому объекту, чтобы при наличии каких-либо ссылок внутри он окружал их тегами, чтобы они стали кликабельными.*

Прежде всего, как это вообще работает?Я немного знаю о выражениях регулярных выражений и могу создавать простые, но я даже не вижу здесь слова "href"!

Как это можно изменить, чтобы ссылка открывалась в другом окне?т.е. как я могу добавить сюда свойство target="_blank"?

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Прежде всего, как это вообще работает?

Очевидно, в других местах кода вы найдете это:

String.prototype.link = function(url) { /* ... */ };

...то закончится возвращением строки.replace делает вызов анонимной функции, переданной ей со строкой, которая соответствует регулярному выражению в качестве аргумента;replace ожидает, что эта функция вернет соответствующую замену, которую затем вставит в строку.(Эта вторая форма replace, которая принимает функцию, а не строку в качестве второго аргумента, весьма полезна, но не так хорошо известна, как можно было ожидать.) Анонимная функция вызывает функцию link для аргумента(url), которая является строкой и возвращает результат.Отсюда мое убеждение, что вы найдете функцию link, добавляемую к String.prototype где-то в коде.

По крайней мере, некоторые браузеры добавляют кучу нестандартных методов к Stringэкземпляры, которые обертывают строку в теги;link является одним из них.Он просто возвращает разметку элемента a с использованием заданного URL.

Как это можно изменить, чтобы ссылка открывалась в другом окне?

На самом деле ответ на первый вопрос отвечает на второй: предположительно, вы найдете разметку в этой функции link;вы можете обновить его там.

Просто замените использование нестандартной функции link на собственную конкатенацию строк:

return '<a href="' + url + '">' + url + '</a>';

Обычно я бы сказал, что вам следуетОбязательно кодируйте объекты HTML, но, поскольку вы уже имеете дело со строкой исходного кода HTML, предположительно, они уже должны быть правильно закодированы.

2 голосов
/ 14 марта 2012

'href' происходит от строки url.link(url);

String.prototype.link - это глупая функция, включенная для обратной совместимости с таким глупым кодом, как этот.Это глупо, и вы должны прекратить его использовать.

Если вы хотите увидеть, что он делает, просто alert('something'.link('anotherthing'));

Это похоже на String.prototype.blink.Глупо.

0 голосов
/ 14 марта 2012

Согласно: http://www.w3schools.com/jsref/jsref_link.asp Метод String.link () возвращает текст «бла» в виде HTML-ссылки

<a  href='blah'>blah</a>".

Так что я думаю, у вас есть 2 решения:

1 / переопределить определение link () (не рекомендуется), объявив что-то вроде:

String.prototype.link = function(url) {
    return "<a target='_blank' href='"+url+"'>"+url+"</a>";
}

2 / определить другую функцию и использовать ее вместо link () в определении parseURL ():

String.prototype.blankLink = function(url) {
    return "<a target='_blank' href='"+url+"'>"+url+"</a>";
}

Тогда ваш код должен стать:

String.prototype.parseURL = function() {
return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function(url) {
        return url.blankLink(url);
    });
};

Чтобы объяснить немного, replace () возвращает входную строку, где части, соответствующие регулярному выражению (которое в данном случае выражает форму любого URL), заменяются вторым аргументом (безымянная функция, которая возвращает url.link () ). Ссылка JS не говорит о том, что если вы передадите функцию - вместо строки - в качестве второго аргумента функции replace (), то replace () предоставит текущую совпадающую часть в качестве аргумента этой безымянной функции-аргумента. Сладкая механика, при условии, что это работает в любом браузере;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...