簡單枚舉 | iframe

枚舉:
1、用for從眾多可能出現的答案中找匹配;
2、即通過if找正確的答案。

<p>
    <span>A</span>
    <span>B</span>
    <span>C</span>
    <span>D</span>
    <span>E</span>
</p>
<p>
    <span>A</span>
</p>
<p>
    <span>E</span>
    <span>E</span>
    <span>E</span>
    <span>E</span>
    <span>E</span>
</p>
var _p = document.getElementsByTagName('p')
var _span0 = _p[0].getElementsByTagName('span')
var _span1 = _p[1].getElementsByTagName('span')
var _span2 = _p[2].getElementsByTagName('span')
//枚舉算法,用for從眾多可能出現答案的條件中找匹配,即通過if正確的答案
for (var i = 1; i <= 9; i++) { //A
  for (var j = 0; j <= 9; j++) { //B
    for (var k = 0; k <= 9; k++) { //C
      for (var m = 0; m <= 9; m++) { //D
        for (var n = 0; n <= 9; n++) { //E
          var a = 10000 * i + 1000 * j + 100 * k + 10 * m + n; //_p[0]
          var b = i; //_p[1]
          var c = n * 111111; //_p[2]
          if (a * b == c) {
            _span0[0].innerHTML = i;
            _span0[1].innerHTML = j;
            _span0[2].innerHTML = k;
            _span0[3].innerHTML = m;
            _span0[4].innerHTML = n;
            _span1[0].innerHTML = i;
            for (var z = 0; z < _span2.length; z++) {
              _span2[z].innerHTML = n
            }
          }
        }
      }
    }
  }
}

枚舉小例:
點擊任意a,當前innerHTMl加到ul,若已存在不加[方法返回false],若不存在添加[方法返回true]
要點,創建方法檢測當前點擊innerHTMl是否存在於頁面
拓展:如已存在,則把當前點擊項移到最前面

<a href="javascript:;">北京</a>
<a href="javascript:;">上海</a>
<a href="javascript:;">深圳</a>
<a href="javascript:;">廣州</a>
<a href="javascript:;">杭州</a>
<a href="javascript:;">天津</a>
<a href="javascript:;">成都</a>
<ul id="ul">
</ul>
var a = document.getElementsByTagName('a')
var ul = document.getElementById('ul')
var li = ul.getElementsByTagName('li')
for (var i = 0; i < a.length; i++) {
  a[i].onclick = function () {
    if (mj(this.innerHTML)) { //如果當前innerHTML 沒有相同返回 true
      var _li = document.createElement('li');
      _li.innerHTML = this.innerHTML;
      if (!li[0]) {
        ul.appendChild(_li)
      } 
      else {
        ul.insertBefore(_li, li[0])
      }
    } 
    else { //有相同返回false,無法添加,但可以把當前點擊移到最前面
      mj2(this.innerHTML)
    }
  }
}
//檢測方法
function mj(txt) {
  var result = true;
  for (var i = 0; i < li.length; i++) {
    if (li[i].innerHTML == txt) { //可能出現的找匹配,如果已存在
      result = false
    }
    //  else{result = true;}//切換即可添加 特別留意理解這句放與不放
  }
  return result;
}
function mj2(txt) { //當前新添加移到最上面
  for (var i = 0; i < li.length; i++) { //眾多可能出現的
    if (li[i].innerHTML == txt) { //創建條件
      ul.insertBefore(li[i], li[0])
    }
  }
}
}



操作iframe

1、_iframe.contentWindow.document.getElementById('box') 無兼容性

2、_iframe.contentDocument.getElementById('box') IE6/7不支持
主html

<input type="button" value="操作window"/>
<input type="button" value="操作document"/>
<input type="button" value="該變iframe大小一"/>
<input type="button" value="該變iframe大小二"/>
<iframe src="iframe-被嵌套1.html" frameborder="0" scrolling="no"></iframe>
<iframe src="iframe-反操作.html" frameborder="0"></iframe>
<div id="box">這是正常文檔的內容,被iframe反操作的box</div>
var _iframe = document.querySelectorAll('iframe') [0]
var _iframe2 = document.querySelectorAll('iframe') [1]
var inp = document.querySelectorAll('input') [0]
var inp2 = document.querySelectorAll('input') [1]
var inp3 = document.querySelectorAll('input') [2]
var inp4 = document.querySelectorAll('input') [3]
inp.onclick = function () {
  console.log(_iframe.contentWindow); //iframe的window對象,無兼容性
  _iframe.contentWindow.document.getElementById('box').style.background = 'red'
}
inp2.onclick = function () {
  _iframe.contentDocument.getElementById('box').style.color = '#fff'
  //IE6/IE7不支持
}

iframe-被嵌套1.html

<div id="box">這是iframe裏的內容,被所調用的操作</div>
<div style="width: 300px;height: 300px;background: #f90;"></div>

iframe反操作

iframe-反操作.html
1、window.parent 獲取父層頁面;
2、window.top 獲取最頂層頁面;
3、iframe防止被嵌套;if(window!=window.top){ window.top.location.href = window.location.href; }

<input type="button" value="iframe反操作" />
<div style="width: 200px;height: 200px;background: green;"></div>
var inp = document.querySelector('input')
//獲取父層的頁面 window.parent
inp.onclick = function () {
  window.parent.document.getElementById('box').style.background = 'peru' //無兼容性
}
//window.top最頂層
window.top.document.getElementById('box').style.color = '#fff'

//防止被嵌套
if (window != window.top) { //當前window !=最頂層window
  window.top.location.href = window.location.href; //跳轉至頁面
}

iframe.onload 事件

var _iframe = document.createElement('iframe')
_iframe.src = 'iframe-反操作.html'
document.body.appendChild(_iframe)
//        _iframe.onload = function () {
//            alert(123)
//        }
//ie: iframe.onload 事件 只能用綁定的形式;
_iframe.attachEvent('onload', function () {
  //alert(123)
})

iframe 設置寬高
如多頁面切換需設置定時器,否則會因執行太快而產生bug設置失效

function changeHeight() {
  setTimeout(function () { 
    _iframe.height = _iframe.contentWindow.document.body.offsetHeight //本頁面展示的高 = iframe頁面展示的高
  }, 100)
}

//使用
inp3.onclick = function () {
  _iframe.src = 'iframe-被嵌套1.html'
  changeHeight()
}
inp4.onclick = function () {
  _iframe.src = 'iframe-反操作.html'
  changeHeight()
}
//JQuery获得iframe的window对象
var win = $('#ifr')[0].contentWindow;  

//JS原生方法获得iframe的window对象
document.getElementById("ifr").contentWindow;  

$('#ifr')[0].contentWindow 和 document.getElementById("ifr") ;

var ifr1 = document.getElementById("ifr");  
var ifr2 = window.frames[0];  
ifr2.frameElement 是等价于 ifr1;

JS性能基礎

DOM性能優化
DOM :getElementById innerHTMl......
ECMA:if for ......
BOM:location open close......

var box = document.getElementById('box')
var str = '';
for (var i = 0; i < 5000; i++) {
  str += 'a'
}
//獨立js中操作
box.innerHTML = str //DOM與jq只交互1次,

chrome:dom方法appendChild要比直接innerHTMl性能要好,其他都為innerHTMl性能較好。



DOM 與JS

* 1、減少DOM操作str cloneNode()
* 2、訪問元素集合,盡量使用局部變量 len
* 3、盡量只獲取元素節點的方法 如若childNodes 元素節點,文本節點, children來替換
* 4、選擇器API querySelector/querySelectorAll
//片斷一
for (var i = 0; i < 10000; i++) {
  var li = document.createElement('li')
  li.innerHTML = 'li'
  ul.appendChild(li)
}
//片斷二
for (var i = 0; i < 10000; i++) {
  str += '<li></li>'
}
ul.innerHTML = str;
//片斷三
var li = document.createElement('li')
li.innerHTML = 'li'
console.time('hello3')
for (var i = 0; i < 10000; i++) {
  var liN = li.cloneNode(true);//使用cloneNode
  ul.appendChild(liN)
}
//片斷四
for (var i = 0; i < li.length; i++) {
  li[i].innerHTML = 'li';
}
//片斷五
for (var i = 0, len = li.length; i < len; i++) {
  li[i].innerHTML = 'li';
}
 var box = document.getElementsByTagName('li')
 var box = document.querySelectorAll('#box li')



DOM 與瀏覽器

* 1、重排、改變頁面內容 ,如通過js該變位置寬高或形狀
* 2、重繪:瀏覽器顯示內容,如重排結束後需要顯示效果,如只該變背景,不改變寬高,則只發生重繪,不會發生重排
* 3、添加順序:盡量在appendChild前添加操作,
* 4、合並dom操作:利用cssText
* 5、緩存布局信息
* 6、文檔碎片 createDocumentFragment()
//片斷六
for (var i = 0; i < 5000; i++) {
  var li = document.createElement('li')
  ul.appendChild(li)
  li.innerHTML = 'li'
}
//片斷七
for (var i = 0; i < 5000; i++) {
  var li = document.createElement('li')
  li.innerHTML = 'li' //加在appendChild前面,不會發生重排重繪過程
  ul.appendChild(li)
}
li.style.width = '100px'
li.style.height = '100px'
li.style.background = 'red'
//推薦
li.style.cssText = 'width:100px;height:100px;background:red;'
//片斷八
setInterval(function () {
  box.style.left = box.offsetLeft + 1 + 'px'
  box.style.top = box.offsetTop + 1 + 'px'
}, 30)
//片斷九
var L = box.offsetLeft,T = box.offsetTop;
setInterval(function () {
  L++;
  T++;
  box.style.left = L + 'px'
  box.style.top = T + 'px'
}, 30)
//片斷十
var ul2 = document.getElementById('ul2')
for (var i = 0; i < 5000; i++) {
  var _li = document.createElement('li')
  ul2.appendChild(_li)
}

//片斷十一
var ul2 = document.getElementById('ul2')
var _Frag = document.createDocumentFragment(); //創建一個box,每次添加裏都先加到box裏
for (var i = 0; i < 5000; i++) {
  var _li = document.createElement('li')
  _Frag.appendChild(_li)
}
ul2.appendChild(_Frag) //添加完後再加把box加到ul2裏



DOM與事件:事件委託

DOM與前端模板:能更好的對邏輯和視力分離,MVC架構的基礎 如jquery.tmpl