Заобиколно решение за грешка при рисуване при наслагване на ‹div› върху ‹iframe› в Safari?

Получавам много странен бъг при рисуване в Safari и бих искал да видя дали има някакво решение, което мога да предприема...

В момента показвам ‹div› (абсолютно позициониран, висок z-индекс) върху IFrame, който показва съдържание от други сайтове. Само за контекст, ‹div› е лента с инструменти, която показваме над други сайтове.

Това работи добре във всички браузъри, но в Safari, когато IFrame показва някои сайтове и потребителят превърта страницата в IFrame, чертежът на лентата с инструменти се прецаква.

Ето един много минималистичен POC, който възпроизвежда проблема:

<html>
<head>
</head>
<body>

<div id="mainContainer" style="position: absolute; top: 0; left:0; height: 500px; width: 500px; border: 2px solid red;">
    <div id="floatingToolbar" style="position: absolute; top: 20px; right: 20px; height: 40px; width: 300px; background-color: blue; color: red; z-index:200;">
        Toolbar!
    </div>
    <iframe id="theIFrame" src="http://www.overstock.com/Clothing-Shoes/Skynyrd-Mens-Rock-Roll-Freebird-Lyric-T-shirt/3023049/product.html?sec_iid=33972" style="position: absolute; top: 0; left:0; height: 500px; width: 500px; border: 2px solid red;">
    </iframe>
</div>

</body>
</html>

Ако го запишете на твърдия си диск и го отворите с Firefox, ще получите това:

alt text
(източник: crystalgears.com)


И ако го отворите в Safari и превъртите безумно нагоре и надолу във IFrame, ще изглежда така:

alt text
(източник: crystalgears.com)


Сега това само се случва в Safari. Chrome работи правилно. Това се случва в Safari Windows и Mac. Тествам със Safari Windows 3.2.1 (525.27.1), но съм виждал да се случва и в други версии.

За да направя това по-мистериозно, това се случва само когато показвам някои сайтове във вградената рамка. Например, ако показвате www.google.com или www.stackoverflow.com, лентата с инструменти работи перфектно. Въпреки това артикулите в www.overstock.com или www.amazon.com работят добре. Освен това не само няколко сайта ми създават този проблем. Това е мнаго. Не успях да намеря нещо специално, което да разграничава последователно „лошите“ сайтове от „добрите“, но не съм търсил достатъчно задълбочено. Може би това е DOCTYPE или нещо друго. Това, което изглежда като правило (въпреки че несъмнено е много меко), е, че „сложните“ или „тежки“ сайтове са склонни да го задействат, докато „леките“ сайтове не го правят.

Някакви идеи какво мога да направя, за да заобиколя този проблем?

Благодаря!


person Daniel Magliola    schedule 11.05.2009    source източник
comment
о! забавление! Вече е докладвано като грешка :-( https://bugs.webkit.org/show_bug.cgi?id=25216   -  person Daniel Magliola    schedule 12.05.2009
comment
За протокола, не виждам това в Safari 4 Beta.   -  person bchang    schedule 12.05.2009


Отговори (1)


Бих очаквал неочакваното при рендиране върху iframe, подобно на това, когато div е позициониран върху флаш видео. Може да работи и понякога го прави. Но превъртането или движението във флаш или iframe може да предизвика някои проблеми с изобразяването.

Има ли някакъв шанс да използвате различно решение от iframe? Ще бъде ли достатъчно използването на библиотека като cURL за извличане на данните от друга страница?

person alex    schedule 11.05.2009
comment
Благодаря за вашия отговор! Не, не можем да се разминем без IFrame, искаме да позволим на потребителите да използват другия сайт в нашия. Проксирането му чрез cURL ще счупи повечето съвременни сайтове, тъй като много от тях зависят от работата на Javascript за голяма част от тяхната функционалност. Съгласен съм, че рисуването върху IFrame е странно. Дори не очаквах z-index да работи, когато го пробвах за първи път, но в интерес на истината всички останали браузъри се държат ПЕРФЕКТНО, дори скапания IE6... - person Daniel Magliola; 12.05.2009
comment
Е, предполагам, че зависи от това колко потребители използват Safari спрямо това колко силно искате хората да използват тази функционалност. cURL все още може да работи с JS.. преминете през външните препратки и ги направете абсолютни пътища. Разбира се, този метод също не е добър начин. Само едно предложение. - person alex; 12.05.2009
comment
Да, това е катастрофа в сигурността, която чака да се случи... :-) Освен това преминаването през външни препратки е идеално решение. Много сайтове включват JS динамично, като правят странни Response.Write, добавят ‹script› елементи и т.н. Но преди всичко това е голяма дупка в сигурността, която не желая да се опитвам да затворя сам (както Facebook прави с техния FBJS) - person Daniel Magliola; 12.05.2009
comment
Не е ли response.write част от ASP? cURL може да получи само това, което е изведено на браузъра. - person alex; 12.05.2009