Как определить, загружается ли веб-страница внутри iframe или непосредственно в окне браузера?

Ответ на +1 karim охватывает его. Вы также можете сказать:

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"

, чтобы выполнить объединение строк в конце MySQL, а не в том, что в этом случае есть какая-то особая причина.

Все становится немного сложнее, если частичный wrd, который вы ищете, может сам содержать символ процента или подчеркивания (поскольку они имеют особое значение для оператора LIKE) или обратную косую черту (которую MySQL использует как другой уровень экранирования в операторе LIKE - неправильно, согласно ANSI SQL-стандарт).

Надеюсь, это не повлияет на вас, но если вам нужно правильно это получить, вот беспорядочное решение:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'");
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var);
$stmt->bindParam(':term', $escaped);
528
задан akshat 28 November 2008 в 15:45
поделиться

3 ответа

Браузеры могут блокировать доступ к window.top из-за та же политика источника . Ошибки IE также происходят. Вот рабочий код:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

top и self оба window объекты (наряду с parent), таким образом, Вы видите, является ли Ваше окно главным окном.

995
ответ дан James Gentes 28 November 2008 в 15:45
поделиться

Так как Вы спрашиваете в контексте приложения Facebook, Вы могли бы хотеть рассмотреть обнаружение этого в сервере, когда начальный запрос выполнен. Facebook проведет набор querystring данных включая fb_sig_user ключ, если это назовут от iframe.

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

1
ответ дан HectorMac 28 November 2008 в 15:45
поделиться

RoBorg корректен, но я хотел добавить примечание стороны.

В IE7/IE8, когда Microsoft добавила Вкладки к их браузеру, они повредили одну вещь, которая вызовет опустошение с Вашим JS, если Вы не будете осторожны.

Воображают этот макет страницы:

MainPage.html
  IframedPage1.html   (named "foo")
  IframedPage2.html   (named "bar")
    IframedPage3.html (named "baz")

Теперь в кадре "baz" Вы нажимаете на ссылку (никакая цель, загрузки в кадре "baz"), это хорошо работает.

, Если страница, которая загружается, позволяет, называют его special.html, JS использования, чтобы проверить, имеет ли "это" родительский кадр, названный "панелью", это возвратит (ожидаемый) true.

Теперь позволяет, говорят, что страница special.html, когда она загружается, проверяет родительский кадр (для существования и его имени, и если это - "панель", она перезагружает себя в кадре панели. например,

if(window.parent && window.parent.name == 'bar'){
  window.parent.location = self.location;
}

Пока неплохо. Теперь прибывает ошибка.

Позволяет, говорят вместо того, чтобы нажать на исходную ссылку как нормальный, и загрузить страницу special.html в кадре "baz", Вы щелкнули средней кнопкой по нему или приняли решение открыть его на новой вкладке.

, Когда та новая вкладка загружается ( без родительских кадров вообще! ) IE введет бесконечный цикл загрузки страницы! , потому что IE "копирует по" структуре кадра в JavaScript, таким образом, что новая вкладка ДЕЙСТВИТЕЛЬНО имеет родителя, и что родитель ИМЕЕТ имя "панель".

хорошие новости, то, что проверка:

if(self == top){
  //this returns true!
}

, в котором новая вкладка действительно возвращает true, и таким образом можно протестировать на это нечетное условие.

25
ответ дан scunliffe 28 November 2008 в 15:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: