Отключить тег ссылки без доступа к HTML

Итак, у меня есть веб-сайт, над которым я работаю, и в одной части у нас есть встроенная подписка на новостную рассылку. Проблема в том, что встроенный код использует все собственные таблицы стилей, что мешает дизайну сайта. Встраивание выполняется через javascript, поэтому я не могу отключить их, пока не загрузится этот раздел страницы.

По сути, мне нужен script, чтобы отключить весь <link>. Вдобавок ко всему, у links нет classes или ids, поэтому их трудно нацелить.

<link rel=​"stylesheet" type=​"text/​css" href=​"http:​/​/​www.formstack.com/​forms/​css/​3/​default.css?20130404">​

Это одна из ссылок, которые мне нужно отключить. Я пытался найти что-то вроде getElementByType или похожего, но ничего не нашел.

Любая помощь будет оценена по достоинству. Пока код отключает ссылку, мне этого достаточно. Может быть, есть способ найти в документе строку <link> и окружить ее комментариями?

Спасибо, парни

PS, я новичок в javascript и понятия не имею, что я делаю с js


person Daron Spence    schedule 25.04.2013    source источник
comment
Чтобы получить все <link>, вы можете использовать document.getElementsByTagName("link");, но я не знаю, как их отключить. Может, убрать их с .removeChild()? И если вы нацелены на href, вы можете проверить .href.indexOf("http:​/​/​www.formstack.com/​forms/​css/​3/​default.css") === 0   -  person Ian    schedule 26.04.2013
comment
Я предполагаю, что ваша форма подписки на рассылку новостей находится на другом веб-сайте, и вы размещаете ее с помощью iframe?   -  person Unexpected Pair of Colons    schedule 26.04.2013
comment
@Kacey нет, это встроенный Javascript   -  person Daron Spence    schedule 26.04.2013
comment
Можете ли вы показать нам где-нибудь демо, чтобы мы могли увидеть, что происходит?   -  person Unexpected Pair of Colons    schedule 26.04.2013
comment
@Kacey Ссылка   -  person Daron Spence    schedule 26.04.2013
comment
Не ответ, а просто альтернатива. Вы можете просто добавить !important в свой дизайн, чтобы он не был переопределен внешним дизайном. Если этот внешний дизайн также имеет важное значение, загрузите свой css после того, как документ будет готов.   -  person AzDesign    schedule 26.04.2013
comment
Ах я вижу. Лучше всего изучить Constant Contact API и настройте поле так, чтобы пользователи регистрировались с вашего сайта, а информация передавалась в постоянный контакт. Затем вы можете оформить поле так, как хотите. Попытка заблокировать его с помощью Javascript — не лучшее решение. Люди, которые не используют Javascript, увидят его таким, какой он есть сейчас.   -  person Unexpected Pair of Colons    schedule 26.04.2013


Ответы (1)


var test = "http:​/​/​www.formstack.com/​forms/​css/​3/​default.css";
for (var i = 0; i < document.styleSheets.length; i++) {
    var sheet = document.styleSheets.item(i);
    if (sheet.href.indexOf(test) !== -1) sheet.disabled = true;
}

это будет работать, однако это неэффективно (по-прежнему), поскольку он продолжает проверять дополнительные CSSStyleSheets в CSSStyleSheetList после того, как находит совпадение.

если вы не можете не заботиться о поддержке браузера, вы можете использовать Array.prototype.some, чтобы уменьшить количество операций

[].some.call(document.styleSheets, function(sheet) {
    return sheet.disabled = sheet.href.indexOf(test) !== -1;
});

см.: Методы массива в MDN

edit:
Для сочетания производительности и поддержки старых версий подойдет следующее решение:

var test = "http:​/​/​www.formstack.com/​forms/​css/​3/​default.css";
for (var i = 0; i < document.styleSheets.length; i++) {
    var sheet = document.styleSheets.item(i);
    if (sheet.href.indexOf(test) !== -1) {
        sheet.disabled = true;
        break;
    }
}
person rlemon    schedule 25.04.2013
comment
я бы заменил item(i) на item(filepath) ? - person Daron Spence; 26.04.2013
comment
Я добавил скрипт, но он отключил все таблицы стилей. Мне просто нужно отключить определенные, нацелившись на href - person Daron Spence; 26.04.2013
comment
@DaronSpence, вам нужно знать, какой именно, вы можете проверить по href - person rlemon; 26.04.2013
comment
Чем неэффективен первый пример? Это называется break; остановиться. И использование document.styleSheets неэффективно, потому что включены <style> элементов. - person Ian; 26.04.2013
comment
ну, это сейчас после редактирования, однако я все еще думаю, что альтернатива лучше, потому что document.styleSheets НАМНОГО дешевле, чем getElementsByTagName (даже с дополнительными тегами стиля). Вы можете исполнить это сами, если хотите увидеть. - person rlemon; 26.04.2013
comment
С каких это пор это о производительности? Я лучше нацелюсь на то, что необходимо, чем буду тестировать ненужные вещи. Этот скрипт, вероятно, запускается один раз, поэтому разница в производительности, которую вы увидите, настолько незначительна. Как я уже сказал, все, что вам нужно использовать, это break; в цикле for, чтобы остановить цикл, когда элемент найден. - person Ian; 26.04.2013
comment
С каких пор это не связано с производительностью. break в цикле for является улучшением, однако последний скрипт все еще преформирует его. И использование for(;;) с document.styleSheets было бы лучшим сочетанием производительности и поддержки старых версий. - person rlemon; 26.04.2013
comment
@rlemon С каких это пор вы увидите разницу в скорости между document.styleSheets и document.getElementsByTagName("link")? Это единственная разница в скорости между подходами. Совершенно очевидно, что код OP запускается нечасто, поэтому вы не увидите улучшений с document.styleSheets. Применение цикла for не имеет значения, кроме когда вы просматриваете несвязанные элементы, например, что содержит document.styleSheets. Я не знаю, что вы говорите о устаревшей поддержке, потому что .getElementsByTagName так же хорошо поддерживается. - person Ian; 26.04.2013
comment
Я говорил о своем решении с Array.prototype.some (ES5), и сознательное использование менее производительного варианта никогда не будет разумным выбором, когда существует (такое же простое) альтернативное решение, столь же прозрачное и более производительное. Здесь действительно нет аргумента, упускать из виду это неправильно. - person rlemon; 26.04.2013
comment
@rlemon Не совсем. Я предпочитаю смотреть на правильные вещи вместо того, чтобы использовать неправильный метод, чтобы получить то, что нужно. Даже если он на 50 микросекунд медленнее. - person Ian; 26.04.2013