2015-09-13 3 views
6

У меня есть следующий код, чтобы проверить, является ли веб-страница может быть оформлена или нет вовсе:Проверьте, может ли содержимое будет отображаться в плавающем фрейме не работает

var req = new XMLHttpRequest(); 
var test = req.open('GET', link, false); 
console.log("test",test); //ALWAYS undefined 
if(req.send(null)){ //ALWAYS throws error NS_ERROR_FAILURE 
    var headers = req.getAllResponseHeaders().toLowerCase(); 
    console.log("headers"); 
}else{ 
    console.log("FAILED"); 
} 

Я проверил это с несколькими ссылками, frameable или нет, но всегда терпит неудачу. Вы точно знаете, почему?

Ссылки:

ответ

5
  • test не определен, потому что open() объявлен void, он не возвращает никакого значения. Выезд MDN on the open method.
  • Зачем вы проходите: null - send?(см. Править) Если вы намерены вызвать перегрузку отправки, которая не принимает никаких аргументов, вы должны просто позвонить req.send(); вместо этого, если вы хотите вызвать другую версию метода, вы должны передать Blob, Document, DOMString или FormData, , но null не будет работать.
    EDIT: Часто метод вызывается как send(null); похоже, потому, что в какой-то момент истории (этот старый?) аргумент send был обязательным. This question разгадывает тайну.

  • Кроме того, снова send не возвращает никаких значений, поэтому условие в if никогда не будет оценивать true. MDN documents also the send method.

  • Последнее, что вы делаете запрос кросс-домена, то есть вы запрашиваете контент, который находится в другом домене. XMLHttpRequest не обрабатывает, что, скорее всего, вы будете в конечном итоге с этой ошибкой:

    XMLHttpRequest cannot load link. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin origin is therefore not allowed access.

    Заканчивать this question и this на StackOverflow, если вам нужно больше информации об этом.

Вы можете взглянуть на Using XMLHttpRequest снова в сети MDN, он имеет много надежных примеров, которые могут помочь вам ознакомиться с этими запросами.


EDIT: расширение на тему IFrame вложимость.

Обнаружение надежно, если сайт может быть встроен в iframe, сложно, так как this question показывает. Обнаружение (или предотвращение) фрейма в JavaScript похоже на собаку, преследующую собственный хвост.

Тем не менее, веб-сайт, который не хочет быть включенным, надеюсь, отправит X-Frame-Options: DENY header в свой ответ.Это не очень полезно, потому что вы не можете выполнять запросы перекрестных доменов: ваш запрос не удался до, чтобы узнать, установлен ли заголовок X-Frame-Options. Для полноты, это способ проверки того, отвечает ли ответ на XMLHttpRequest данный заголовок (но обратите внимание, что этот будет работать только в том же домене, который предположительно находится под вашим контролем, и вы уже знаете, если страница «frameable»):

function checkXFrame() { 
    var xframe = this.getResponseHeader("X-Frame-Options"); 
    if (!xframe) { 
     alert("Frameable."); 
     return; 
    } 
    xframe = xframe.toLowerCase(); 
    if (xframe == "deny") { 
     alert("Not frameable."); 
    } else if (xframe == "sameorigin") { 
     alert("Frameable within the same domain."); 
    } else if (xframe.startsWith("allow-from")) { 
     alert("Frameable from certain domains."); 
    } else { 
     alert("Someone sent a weird header."); 
    } 
} 

var oReq = new XMLHttpRequest(); 
oReq.open("HEAD" /* use HEAD if you only need the headers! */, "yourpage.html"); 
oReq.onload = checkXFrame; 
oReq.send(); 

(этот код не проверяет 404 или любой другой ошибки)

+1

на! «почему передать нулевой послать?» вопрос, см. http://stackoverflow.com/questions/15123839/why-do-we-pass-null-to-xmlhttprequest-send - неверно говорить 'null' не будет работать – CupawnTae

+0

@CupawnTae oh! Интересно, я этого не знал. Я обновлю ответ. –

+1

это была небольшая точка в любом случае, у вас уже есть мой upvote :-) Также может быть интересно узнать, что все это имеет отношение к тому, может ли контент отображаться в iframe ... – CupawnTae

Смежные вопросы