10

我有一个框架集,其中一个框架中有一个按钮,可将其父框架集最小化到一定大小。

该代码有效,但问题是如果我选择先用鼠标手动调整框架大小,然后按下最小化按钮,它将在 IE8 和 Chrome 中错误地调整大小。它在 FF 中正确调整大小。

我有这个 HTML 结构

...
<frameset cols="32%,*" border="2" frameborder="1" framespacing="1">
    <frameset rows="350,*" border="2" frameborder="1" framespacing="1" id="searchResultFrameset">
        <!-- The minimize button are in this frame searchResultFrame -->
        <frame name="searchResultFrame" scrolling="no" src="dummy">
        <frame name="itemFrame" frameborder="1" scrolling="no" id="itemFrame" src="dummy2"></frameset>
    <frame name="contentFrame" frameborder="0" scrolling="yes" id="contentFrame" src="dummy3">
</frameset>
...

以及按下按钮时执行的代码。

// Minimize frame button
$('.minimizeFrame').toggle(function () {
    parent.document.getElementsByTagName('frameset')[1].setAttribute('cols','22,*');
}, function () {
    parent.document.getElementsByTagName('frameset')[1].setAttribute('cols','32%,*');
});

我可以看到开发人员工具中的cols="32%,*"更改cols="22,*",但仍然呈现错误的大小。

为什么鼠标更改后大小调整不正确?我错过了什么还是浏览器中的错误?或者是否有替代解决方案可以在没有此错误的情况下调整框架大小?

例子

http://jsbin.com/ohihiy/2

4

4 回答 4

2

看起来这是自 2010 年以来一直被忽略的 Webkit 中的这个错误:

https://bugs.webkit.org/show_bug.cgi?id=36584

于 2013-10-01T17:31:10.843 回答
2

这对我有用。我创建了一个“重置”列并“稍后”设置正确宽度的函数。重置后似乎必须有超时或“接触”子帧的一种循环

function init_page() {
  function setCols(frms, cols) {
    // for some magic reason we have to 1st -> reset current cols 
    frms.setAttribute('cols', '');
    // and 2nd ask about child width (it's now clientWidth)
    for (var i = 0; i < frms.children.length; ++i) {
      if (frms.children[i] && (typeof frms.children[i].clientWidth != "undefined" || typeof frms.children[i].width != "undefined")) {
      }
    }
    frms.setAttribute('cols', cols);
  }
  // Minimize frame button
  $('#minimizeButton')
    .toggle(function () {
      setCols(parent.document.getElementsByTagName('frameset')[0], '50,*');
    },
    function () {
      setCols(parent.document.getElementsByTagName('frameset')[0], '50%,*');
    });
}
于 2016-11-15T10:50:10.693 回答
0

如果我理解正确,您尝试设置位于不同框架中的对象的属性。有些浏览器不接受这一点。

如果我尝试重现您的问题,我可以在 Firefox 中看到我可以切换框架的大小(没问题)。

然而,在 chromium 中,我得到一个安全错误,因为我试图在另一个页面上设置一个属性,即框架内页面内的框架集页面。

编辑: 以下代码适用于 IE8。那是你需要的吗?

不要忘记添加 jquery-1.8.2.min.js 文件

文件:index.html

<!doctype html public "-//w3c//dtd html 4.01 frameset//en"
   "http://www.w3.org/tr/html4/frameset.dtd">
<html>
<head>
<title>a simple frameset document</title>
</head>

<frameset cols="32%,*" border="2" frameborder="1" framespacing="1">
    <frameset rows="350,*" border="2" frameborder="1" framespacing="1" id="searchResultFrameset">
        <!-- The minimize button are in this frame searchResultFrame -->
        <frame name="searchResultFrame" scrolling="no" src="frame1.html">
        <frame name="itemFrame" frameborder="1" scrolling="no" id="itemFrame" src="dummy2"></frameset>
    <frame name="contentFrame" frameborder="0" scrolling="yes" id="contentFrame" src="dummy3">
</frameset>

</html>

文件:frame1.html

<html>
  <head>
    <script src="jquery-1.8.2.min.js"></script>

    <script>

    $(init_page);

    function init_page()
        {
        // Minimize frame button
        $('#minimizeButton')
        .toggle(function ()
            {
            parent.document.getElementsByTagName('frameset')[0].setAttribute('cols','22,*');
            },
            function ()
            {
            parent.document.getElementsByTagName('frameset')[0].setAttribute('cols','32%,*');
            });
        }

    </script>
  </head>
  <body>
  <button id='minimizeButton'>toggle</button>
  </body>
</html>
于 2013-02-18T09:26:28.677 回答
0

我遇到了同样的问题,我使用了隐藏,然后设置然后重新出现的建议,它对我有用。请参见下面的示例:

var $frames = $( <parentElement> ).find( '<framesetname>' )[ 0 ];
frames.hide().attr('cols', '*,500').show();

他们为 Chrome、Firefox、IE11 和 Opera 工作。希望对你有效。

于 2016-11-02T20:29:29.877 回答