[Sie-announce] SIEコード [1634] DOMNodexxxイベントとDOMCharacterDataModifiedを発火させるようにした

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 2月 4日 (木) 22:57:21 JST


Revision: 1634
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1634
Author:   dhrname
Date:     2010-02-04 22:57:21 +0900 (Thu, 04 Feb 2010)

Log Message:
-----------
DOMNodexxxイベントとDOMCharacterDataModifiedを発火させるようにした

Modified Paths:
--------------
    branches/ufltima/dom/events.js

Modified: branches/ufltima/dom/events.js
===================================================================
--- branches/ufltima/dom/events.js	2010-02-04 12:43:48 UTC (rev 1633)
+++ branches/ufltima/dom/events.js	2010-02-04 13:57:21 UTC (rev 1634)
@@ -252,7 +252,7 @@
   if (tgans) {                          //ノードがすでにあるならば、
     var s = this[this._num];
     this[this._num] = node;
-    evt.initMutationEvent("DOMAttrModified", true, true, node, null, node.nodeName, node.nodeName, MutationEvent.MODIFICATION);
+    evt.initMutationEvent("DOMAttrModified", true, false, node, null, node.nodeName, node.nodeName, MutationEvent.MODIFICATION);
     node.ownerElement.dispatchEvent(evt); //このとき、MutationEventsが発動
     return s;
   } else {
@@ -261,9 +261,107 @@
     }
     this[this.length] = arg;            //新たに、argを項目として追加する
     this.length +=  1;
-    evt.initMutationEvent("DOMAttrModified", true, true, node, null, node.nodeName, node.nodeName, MutationEvent.ADDITION);
+    evt.initMutationEvent("DOMAttrModified", true, false, node, null, node.nodeName, node.nodeName, MutationEvent.ADDITION);
     node.ownerElement.dispatchEvent(evt);
     return null;
   }
+  evt = null;
 };
+
+/*Node*/ Node.prototype.insertBefore = function( /*Node*/ n, ref) {
+  var tp = this.parentNode;
+  if (tp) {
+    while (!tp) {                              //先祖をたどっていく
+      if (tp === n) {                          //先祖要素が追加ノードならばエラー
+        throw (new DOMException(DOMException.HIERARCHY_REQUEST_ERR));
+      }
+      tp = tp.parentNode;
+    }
+  }
+  if (this.ownerDocument !== n.ownerDocument) { //所属Documentの生成元が違うならば
+    throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+  }
+  if (n.parentNode === this) {                  //入力した要素が子要素ならば
+    this.removeChild(n);
+  }
+  if (!ref) {                                   //参照要素がNULLの場合、要素を追加する(appendChildと同じ効果)
+    this.childNodes[this.childNodes.length] = n;
+    n.previousSibling = this.lastChild;
+  } else {
+    if (ref.parentNode !== this) {              //参照ノードが子要素でない場合
+      throw (new DOMException(DOMException.NOT_FOUND_ERR));
+    }
+    this.childNodes.splice(ref._num,1,n,ref);   //Arrayのspliceを利用して、リストにnノードを追加
+    ref.previousSibling = n;
+  }
+  n.nextSibling = ref;
+  this.firstChild = this.childNodes[0];
+  this.lastChild = this.childNodes[this.childNodes.length-1];
+  n.parentNode = this;
+  var evt = this.ownerDocument.createEvent("MutationEvents");
+  evt.target = n;
+  evt.initMutationEvent("DOMNodeInserted", true, false, this, null, null, null, null);
+  n.dispatchEvent(evt);
+  evt = null;
+  return n;
+};
+
+/*Node*/ Node.prototype.removeChild = function( /*Node*/ ele) {
+  if (!(ele instanceof Node)) {                   //Nodeでなければ
+    throw (new Error());
+  }
+  var evt = this.ownerDocument.createEvent("MutationEvents");
+  evt.target = ele;
+  evt.initMutationEvent("DOMNodeRemoved", true, false, this, null, null, null, null);
+  ele.dispatchEvent(evt);
+  evt = null;
+  if (ele.parentNode === this) {
+    this.childNodes.splice(ele._num,1);           //Arrayのspliceを利用して、リストからeleノードを排除
+  } else {                                        //親が違う場合
+    throw (new DOMException(DOMException.NOT_FOUND_ERR));
+  }
+  if (ele.ownerDocument !== this.ownerDocument) { //所属ドキュメントが違う場合
+    throw (new Error());
+  }
+  return ele;
+};
+
+/*void*/ CharacterData.prototype.appendData = function( /*string*/ arg) {
+  var pd = this.data;
+  this.data += arg;
+  this.length = this.data.length;
+  var evt = this.ownerDocument.createEvent("MutationEvents");
+  evt.target = this.parentNode;
+  evt.initMutationEvent("DOMCharacterDataModified", true, false, null, pd, this.data, null, null);
+  ele.dispatchEvent(evt);
+  evt = arg = pd = null;
+};
+/*void*/ CharacterData.prototype.insertData = function( /*long*/ offset, /*string*/ arg) {
+  var pd = this.data;
+  var pre = this.substring(0, offset - 1);                 //文字列を二つに分けた、前半部分
+  var next = this.substring(offset, this.length - offset); //後半部分
+  this.data = pre + this.data + next;
+  this.length = this.data.length;
+  var evt = this.ownerDocument.createEvent("MutationEvents");
+  evt.target = this.parentNode;
+  evt.initMutationEvent("DOMCharacterDataModified", true, false, null, pd, this.data, null, null);
+  ele.dispatchEvent(evt);
+  evt = arg = pd = null;
+};
+/*void*/ CharacterData.prototype.deleteData = function( /*long*/ offset, /*long*/ count) {
+  var pd = this.data;
+  var pre = this.substring(0, offset - 1);                    //残すべき前半部分
+  var next = this.substring(offset + count, this.length - 1); //後半部分
+  if (offset + count > this.length) {                         //offsetとcountの和が文字全体の長さを超える場合、offsetから最後までのを削除
+    next = "";
+  }
+  this.data = pre + next;
+  this.length = this.data.length;
+  var evt = this.ownerDocument.createEvent("MutationEvents");
+  evt.target = this.parentNode;
+  evt.initMutationEvent("DOMCharacterDataModified", true, false, null, pd, this.data, null, null);
+  ele.dispatchEvent(evt);
+  evt = pd = null;
+};
+
 // _EVENTS_IDL_




Sie-announce メーリングリストの案内
Back to archive index