Как убрать пропуски между Фреймами без ущерба для достоверности HTML? - PullRequest
2 голосов
/ 15 сентября 2009

Я знаю, что кадры плохие. Однако я должен придерживаться их немного дольше. Моя проблема возникает из-за нестандартного атрибута border элемента frameset:

<frameset border="0">
...
</frameset>

Если я не использую этот атрибут, браузеры ставят пробел между каждым кадром. Если я использую атрибут, валидаторы HTML выдают ошибку о «неподдерживаемом атрибуте».

Теперь я слышу, как вы говорите "используйте его и игнорируйте валидатор", это нормально. Я думаю, что могу жить с одним предупреждением валидатора, и браузеры, кажется, не слишком беспокоятся об этом :)

Мой вопрос в основном о хитрости HTML. Как я могу установить границу в 0 и при этом оставаться совместимым с браузером? Думайте об этом как о упражнении для подобных проблем в будущем. Например я попробовал:

<frameset onload="this.border='0'">

и это не сработало.

Я пытался использовать таблицы стилей во внутренних фреймах, чтобы установить "border: 0; margin: 0; padding: 0", он тоже не работал. Похоже, что разрыв возник из неизвестного источника.

Я думал о написании на Javascript, как:

document.write('<frameset border="0">');

Но у меня есть догадка, что это все равно не подтвердится.

Можете ли вы придумать альтернативное решение?


Другие решения, которые не работали:

  • @ Donut: атрибут frameborder для элементов frame или frameset.
  • @ kangax: frameSetObj.setAttribute ('border', 0);

Ответы [ 2 ]

2 голосов
/ 24 октября 2009

Согласно моим тестам, они должны работать:

Для Opera (10):

frameSetObj.setAttribute("framespacing", "0");

Для IE8:

frameSetObj.setAttribute("framespacing", "0");
//set rows and cols attributes again if the frameset already had them.
frameSetObj.setAttribute("rows", rows);
frameSetObj.setAttribute("cols", cols);

Для FireFox 3.5 и Chrome 3

frameSetObj.setAttribute("frameborder", "0");
//same idea as IE8
frameSetObj.setAttribute("rows", rows);
frameSetObj.setAttribute("cols", cols);

Подводя итог, этот код должен работать в любом браузере:

frameSetObj.setAttribute("framespacing", "0");
frameSetObj.setAttribute("frameborder", "0");
frameSetObj.setAttribute("rows", rows);
frameSetObj.setAttribute("cols", cols);
2 голосов
/ 15 сентября 2009

Используйте атрибут frameborder в тегах frame вместо border в теге frameset. Согласно спецификации HTML, для тегов frameset не определен атрибут border (или frameborder).
На самом деле, все страницы W3C в кадрах стоит проверить. Пример , найденный там , может быть полезен для ознакомления. Вы также захотите убедиться, что используете правильный DOCTYPE.
В примере:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
...