2010-06-28 10 views
6

AJAX ile sayfaları yükleyen ve diğer eklentiler ve "widget'lar" ile uyumluluk sağlamak için bir WordPress eklentim var.Satır içi JavaScript'i dinamik olarak kumlamak için en iyi yöntem nedir?

function do_JS(e){ 
     var Reg = '(?:<script.*?>)((\n|.)*?)(?:</script>)'; 
     var match = new RegExp(Reg, 'img'); 
     var scripts = e.innerHTML.match(match); 
     var doc = document.write; 
     document.write = function(p){ e.innerHTML = e.innerHTML.replace(scripts[s],p)}; 
     if(scripts) { 
      for(var s = 0; s < scripts.length; s++) { 
       var js = ''; 
       var match = new RegExp(Reg, 'im'); 
       js = scripts[s].match(match)[1]; 
       js = js.replace('<!--',''); 
       js = js.replace('-->',''); 
       eval('try{'+js+'}catch(e){}'); 
      } 
     } 
     document.write = doc; 
    } 

yüzden daha iyi js biraz sandbox edebilmek istiyorum:

Şu an itibariyle ben içerik blokları güncellenmesi içinde olan tüm satır içi JS değerlendirmek için aşağıdaki kodu kullanabilirsiniz çatışma riski en aza indirilmiştir. Tek bir fikir, dinamik olarak bir oluşturmak ve onun içinde JS'yi çalıştırmaktı, ancak hem uyumluluk sağlamak hem de güvenliği artırmak için biraz daha iyi bir yöntem olduğunu umuyordum. http://en.wikipedia.org/wiki/Caja_project

cevap

1

Şansı bu tam olarak neye ihtiyacınız sizi vermeyecektir, ama nasıl bir fonksiyon ya (function(){/*...*/})() değişmez kendi kendine çalışan işlevi içinde senin senaryo metni kaydırma hakkında:

2

Sen Caja ile javascript recompiling deneyebilirsin.

var strEval = 'try{'; 
strEval += 'widget[' + intWidgetNumber + '] = (function(){'; 
strEval += js; 
strEval += '})();'; 
strEval += '}catch(e){}'; 

Bu düz eval uation daha fazla koruma sağlar ve aynı belgede kodu tutar. Dezavantajı ise, aldığınız kodun global değişkenler için karışık olması (muhtemelen bu soruyu neden soruyorsunuzdur), kodunun başka bir kod üzerinde durması olabilir. Ve eğer this anahtar sözcüğünü kullanırlarsa, kodları büyük olasılıkla tasarlandığı gibi çalışmayacaktır. Ancak bu en azından kapsama alanı içinde uygun şekilde deklare edilen değişkenleri ve işlev bildirimlerini koruyacaktır.

Üçüncü taraf koduyla çok çalıştım (çoğunlukla korkunç, korkunç yazılmış bir reklam kodu) ve en iyi çözümün site kodunuzu uzun ve benzersiz bir ad alanında tutmasını sağladım (mySiteUtils, mySiteGames, vb. veya com.mysite.utils, com.mysite.games vb. Bir reklam ajansı, tam ad alanınızla eşleşen kodlara girmeye karar verirse, sayfanızı yok eder, ancak şimdiye kadar hiçbir zaman gerçekleşmez.

+0

Ne yazık ki, bu eklenti hiç kontrol etmediğim yüzlerce sitede çalışıyor, bu yüzden JS parçacıklarını Caja'dan myspace gibi bir site gibi çalıştıramıyorum. Çözümün yeniden dağıtılabilir olması gerekiyor. –

İlgili konular