从父页

时间:2015-05-09 20:44:12

标签: javascript jquery iframe https tinymce

我正在尝试在父页面的iframe中实现JavaScript。我读了Invoking JavaScript code in an iframe from the parent page但是,得到以下错误。

Error: Permission denied to access property "showIt"
document.getElementById('targetFrame').contentWindow.showIt();

我已尝试在jsfiddle和我的服务器上实现这一点(不知道它是否重要,但它使用https),但得到相同的结果。我还尝试删除子iframe上的$(function(){})包装器,但没有更改。

我的实际应用如下所述。

如何实现这一目标?

我的申请:

我的父网页https://jsfiddle.net/5f4ct5ph/6/)包含iframe。

<iframe width="100%" height="300" src="https://jsfiddle.net/5f4ct5ph/5/embedded/result/" id="targetFrame"></iframe>

<button id="show">Show</button>
<button id="hide">Hide</button>

$(function () {
    $('#show').click(function () {
        document.getElementById('targetFrame').contentWindow.showIt();
    });
    $('#hide').click(function () {
        document.getElementById('targetFrame').contentWindow.hideIt();
    });
});

iframe页面(https://jsfiddle.net/5f4ct5ph/5/)包含一个tinymce编辑器。

<div id="content">Initial content goes here</div>

#content {height:200px;width:400px;border: 1px solid;}

$(function () {
    tinymce.init({
        selector: "#content",
        width : 400,
        height: 200,
        setup : function(ed) {
            ed.on('init', function(e) {
                e.target.hide();
            });
        }
    });

    function showIt() {
        tinymce.get('content').show();
    };

    function hideIt() {
        tinymce.get('content').hide();
    };
});

2 个答案:

答案 0 :(得分:1)

通常,如果iframe和parent在同一个域上,它应该可以工作,但是从窗口到窗口的通信存在限制。您可以尝试使用postMessage,如下所示:

在您的父页面中,在click事件中,您可以执行以下操作,而不是直接调用该函数:

CREATE TRIGGER CheckIfUnique_mydata_value ON dbo.data
AFTER insert, update
AS
BEGIN
--check if we passed multiple values
  IF EXISTS(SELECT 1 FROM inserted GROUP BY value HAVING COUNT(*) > 1)
  BEGIN
    RAISERROR('You tried to insert a duplicate value within the result set. Ensure you only pass unique values!', 16,1)
  END
  --check if we inserted a value that already exists that is not me (works for updates on me too!)
  IF EXISTS(SELECT 1 FROM dbo.data m INNER JOIN inserted i ON m.value = i.value AND m.id <> i.id)
  BEGIN
    RAISERROR('Duplicate Value found',16,1)
  END
END;

你在iframe:

child_window = document.getElementById('targetFrame').contentWindow;
child_window.postMessage("showit" or "hideit", your_domain);

确保你的函数showIt和hideIt可以在你调用check_message的地方使用。

同样,可能还有另一个问题,很难用嵌入式jsfiddle来判断,但无论如何,在处理iframe和javascript时,postMessage通常比直接访问函数和变量更灵活,更安全。

答案 1 :(得分:1)

fiddle.jshell.net(父文档域)与jsfiddle.net(您的iframe域)不同。

我已将您的代码更改为指向jshell.net网址(您可以使用jsfiddle右下方框架的网址而不是地址栏来获取此内容。)

https://jsfiddle.net/GarryPas/5f4ct5ph/7/

似乎没有定义

hideIt()$(function () { ... function showIt() { tinymce.get('content').show(); }; function hideIt() { tinymce.get('content').hide(); }; }); (因为它们在匿名函数中)。改变这个:

$(function () {
    ...
});

function showIt() {
    tinymce.get('content').show();
}

function hideIt() {
    tinymce.get('content').hide();
}

对此:

<table id="items">
<tr>

    <td><input type="text" name="description[]"/></td>
    <td><input type="text" name="quantity[]" id="quantity[0]" onkeyup="sum(0);"/></td>
    <td><input type="text" name="price[]" id="price[0]" onkeyup="sum(0);"/></td>
    <td><input type="text" name="lineTotal[]" id="lineTotal[0]" readonly /></td>
    <td><input type="button" onclick="addLine();" value="+" /></td>

</tr>
</table>
<script>
var i = 0;
function addLine() {
        i++;        
        var row = document.createElement('tr');
        var td = document.createElement('td');
        td.innerHTML = '<input type="text" name="description['+i+']" id="description['+i+']"/>';
        row.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<input type="text" name="quantity['+i+']" id="quantity['+i+']" onkeyup="sum('+i+');"/>';
        row.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<input type="text" name="price['+i+']" id="price['+i+']" onkeyup="sum('+i+');"/>';
        row.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<input type="text" name="lineTotal['+i+']" id="lineTotal['+i+']" readonly/>';
        row.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<input type="button" onclick="removeLine(this.parentNode.parentNode)" value="-">';
        row.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<input type="button" onclick="addLine();" value="+" />';
        row.appendChild(td);

        document.getElementById('items').appendChild(row);
    }

    function removeLine(row) {
      document.getElementById('items').removeChild(row);
    }

    function sum(i) {
        var q = document.getElementById('quantity['+i+']').value;
        var p = document.getElementById('price['+i+']').value;
        var result = parseInt(q) * parseInt(p);

        if(q=="" || p==""){
            document.getElementById('lineTotal['+i+']').value = 0;
        }

        if (!isNaN(result)) {
            document.getElementById('lineTotal['+i+']').value = result;
        } 
    }

</script>

然后删除我的提醒并放回我注释掉的原始代码。