0

不确定这是否可能,但是......我可以从 one.html 弹出一个窗口(例如到 somesite.com/index.html)并将所有 HTML 保存在 one.html 的隐藏字段中吗?

谢谢!

4

2 回答 2

3

通过“弹出窗口”执行此操作将导致各种异常,因为浏览器具有针对跨域任何内容的规则。他们试图阻止诸如javascript之类的东西试图访问另一边的文档,有太多的黑客会去“哦,耶,另一个漏洞利用!”。

如果您正在寻找一种将 HTML 加载到页面元素中的方法,我建议您使用 AJAX。要使用浏览器的内置 ajax,可以使用 XMLHttpRequest 对象。其步骤是首先创建对象,然后告诉它您要获取什么以及如何获取,然后获取它,然后读取数据。

这是一个例子:

// Create the object
var xhr = new XMLHttpRequest();
// Open page
xhr.open( 'GET', '/index.html', true );
// Register your events
xhr.onsuccess = function() {
    // awesome, it loaded!
    destination.innerHTML = xhr.responseText;
};
xhr.onerror = function(e) {
   // the page denied my request because: e
};
// send any data if you want, or just execute the request
xhr.send( myData || null );

目的地将是这样的:

// jQuery version:
var destination = $( 'textarea#content-holder' );
// Equivalent to:
var destination = (function(tag, id) {
    var elms = document.getElementsByTagName(tag);
    for ( i = 0; i < elms.length; i++ ) {
        if ( elms[i].id === id ) return elms[i];
    }
    return undefined;
})('textarea', 'content-holder');

另一方面,一个很棒的支持 ajax 的库是 jQuery,你可以从http://jquery.com/获得它。我推荐 ajax 的主要原因是它为不同类型的 ajax 请求提供了一些不同的 hack 和补丁,它非常简洁,您可以通过它避免很多痛苦。

要加载您正在尝试的内容,您的代码将如下所示:

$( destination ).load( '/index.html', function() {
    // do stuff after it's been loaded
);

jQuery 将让您做的另一件非常酷的事情是从“index.html”加载页面的特定部分,即通过标准查询。例如,假设您只想从具有类“load-me”的元素加载标记,您应该这样做:

$( destination ).load( '/index.html .load-me', function() {
    // after load stuff
);

完全绕过跨域限制的一种方法是使用 cURL,但这需要一些 PHP。这是一个简单的例子:

在 /ajax.php 中写:

<?php
    if ( ! $_POST['ajax'] ) die();

    // this doesn't consider errors
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $_POST['url']);

    curl_exec($ch);
    curl_close($ch);
?>

在你的 javascript 中写:

var xhr = new XMLHttpRequest();
// Open the script
xhr.open( 'POST', '/ajax.php', true);
// Register your events
xhr.onsuccess = function() {
    // awesome, it loaded!
    destination.innerHTML = xhr.responseText;
};
xhr.onerror = function(e) {
   // the page denied my request because: e
};
xhr.send( { 'ajax':'true', 'url':'http://somesite.com/index.html' } );

或者在 jQuery 中:

$( destination ).load( '/ajax.php', {ajax:true,url:'http://somesite.com/indexhtml'}, function() {
    // awesome, it loaded!
} );

需要考虑的事项: - 使用 AJAX,您仍然无法发出跨域请求,有办法,但没有完美的办法。(使用 XMLHttpRequest,您必须自己查找和编写 hack

  • 如果没有 jQuery,将很难解析加载的数据。例如,如果你想抓住一个特定的元素,我希望你有疯狂的 RegExp 技能。

  • 不同的浏览器有不同的ajax实现。在 IE 中,构造函数是 ActiveXObject.Create('XMLHttpRequest')。注意:所有这些都是 jQuery 的一部分。

希望你把事情弄清楚!XD

于 2012-11-22T00:13:24.437 回答
0

如果弹出窗口在同一个域中,您可以在弹出窗口中编写以下代码:

opener.document.getElementById('hidden').value = "the value you want";
于 2012-11-21T23:35:58.730 回答