2015-04-15 16 views
5

1) Javascript'te jQuery'yi uygulamak için bir görevim var. Ama bir nedenden dolayı, yöntemimin her biri çalışmıyor. Örneğin ijquery'nin küçük uygulaması

$('.a').each(function (index) {$(this).append('<b>' + index + '</b>')}) 

yazarken o

DOMException döndürür: yürütülemedi 'querySelectorAll' 'Belge' üzerine: '[object Object]' geçerli seçici değildir.

Ayrıca, diğer işlevlerin içinde this.each kullanamıyorum. Örneğin, forEach yerine her birini kullanmış olsaydım, işe yaramazdı.


<script type="text/javascript"> 
(function() { 
    function $(selector) { 
    if (this instanceof $) return this.search(selector) 
     return new $(selector); 
    } 
    $.prototype = { 
    constructor: $, 
    length: 0, 

    search: function(selector) { 
     var that=this; 
     var elems=Array.prototype.slice 
      .call(document.querySelectorAll(selector)); 
     elems.forEach(function(x,i){that[i]=x;}); 
     this.length = elems.length; 
     return this; 
    }, 

    append: function(text) { 
     if (text instanceof $) { 
     this[0].appendChild(text[0]); 
     for(var i = 1; i < this.length-1; i++) { 
      var p = text[0].cloneNode(true); 
      this[i].appendChild(p); 
     } 
     } else Array.prototype.slice 
      .call(this).forEach(function(x){ 
       x.innerHTML = x.innerHTML + text; 
      }); 

     return this; 
    }, 

    each: function(callback){ 
     for (var i=0;i<this.length;i++){ 
     this[i]=callback.call(this,this[i]) 
     }; 
     return this; 
    }, 

    } 
    window.$ = $; 
}()); 

+3

* "Ben Javascript'i jQuery uygulamak için bir görev var" * Er .... jQuery * ** *** "on" (in) JavaScript uygulanmaktadır. –

+0

bu fiddle üzerinde çalışıyor burada [demo] (http://jsfiddle.net/n4aspu8p/) – ozil

+7

FYI bir '# id' seçen bir seçici üzerinde' .each() 'yöntemini kullanarak tek bir unsur olan) hiç mantıklı değil. –

cevap

5

i

$('#id').each(function (index) {$(this).html('<b>' + index + '</b>')}) 

bu

DOMException döner geç Örneğin: yürütmek başarısız 'querySelectorAll 'Belgesi' ile: [nesne Nesne] 'geçerli bir seçici değil.

Sen each callback'inde içindeki $(this) yapıyoruz. Böylece ,ile instanceof $ olmayan DOM öğesine ayarlandı ve böylece DOM öğesini geçerek new $(selector) numaralı telefonu çağırırsınız. Bu, this.search(selector) numaralı çağrıyı sonlandırır; burada selector, DOM öğesidir. Sonra querySelectorAll(selector)'u ara. QSA, DOM öğelerini değil, dizeleri kabul eder ve böylece öğe "[object Object]" dizesine dönüştürülür (veya bazı motorlarda "[object HTMLElement]" olur) ve başarısız olur.

Bu hataları, tarayıcınızda yerleşik hata ayıklayıcısını kullanarak kod deyiminde gezinerek tanıyabilirsiniz. Herhangi bir nedenden dolayı jQuery'yi yeniden kullanacaksanız, tam olarak bunu yapma alışkanlığınıza girmeniz gerekir: Hata ayıklayıcısını kullanarak, neyin yanlış olduğunu saptamak ve düzeltmek. Bu durumda, örneğin, selector'un bir dize olmadığını algılamak istersiniz. belli belirsiz böyle bir şey:

search: function(selector) { 
    var that=this, elems; 
    if (typeof selector === "string") { 
    elems = Array.prototype.slice.call(document.querySelectorAll(selector)); 
    elems.forEach(function(x,i){that[i]=x;}); 
    this.length = elems.length; 
    } else { 
    this[0] = selector; 
    this.length = 1; 
    } 
    return this; 
}, 

Ama çok ve için ayıklayıcısını gerekir Eğer bunun ötesinde içine edeceğiz diğer şeyler, bir sürü olacaktır.

+0

Neden bir append işlevinin dışına çıktığımda bunun iyi göründüğünü anlayamıyorum, ancak sonraki adım her işleve geliyor ve şimdi bu [0] undefined. – Aleks

+0

Anladım! her fonksiyonum doğru yazılmadı! – Aleks

+0

Henüz bir sorum yok! .children() işlevini yazdığımda, değiştirilmeyi ve geri dönmesini istiyorum. Tüm özellikleri sildiğim zaman: 0,1,2 ... 'bu' uzunluğa kadar ve sonra bunların çocukları olan yenileriyle değiştirilsin mi? Veya bunu yapmak için daha şık bir yöntem var mı? – Aleks

0

Bu USECASE için çalışacak ama biraz daha karmaşık olacağını tüm sınır durumları uygulamak için:

(function() { 
    function $(selector) { 
    if (!(this instanceof $)){//forgot new 
     return new $(selector); 
    } 
    if(typeof selector === 'string'){ 
     return this.search(selector); 
    } 
    //assuming selector is a dom object 
    this[0]=selector; 
    this.length=1; 
    } 
    $.prototype = { 
    constructor: $, 
    length: 0, 

    search: function(selector) { 
     var that=this; 
     var elems=Array.prototype.slice 
      .call(document.querySelectorAll(selector)); 
     elems.forEach(function(x,i){that[i]=x;}); 
     this.length = elems.length; 
     return this; 
    }, 
    append: function(text) { 
     if (text instanceof $) { 
     this[0].appendChild(text[0]); 
     for(var i = 1; i < this.length-1; i++) { 
      var p = text[0].cloneNode(true); 
      this[i].appendChild(p); 
     } 
     } else { 
      this.each(function(x){ 
       this.innerHTML = this.innerHTML + text; 
      }); 
     } 
     return this; 
    }, 
    // callback is called with the invoking object to be the dom element 
    each: function(callback){ 
     for (var i=0;i<this.length;i++){ 
     this[i]=callback.call(this[i],i); 
     }; 
     return this; 
    }, 

    } 
    window.$ = $; 
}()); 
$('.a').each(function (index) {return $(this).append('<b>' + index + '</b>')}) 
+0

Cevabınız çok yardımcıdır, ancak her bir işlev de değiştirilmelidir, böylece yalnızca geri arama çağrısı yapınız, ancak buna [a] atamayalım. – Aleks