Düzensiz davranış JavaScript kullanarak form alanı değerleri ile PHP imploded diziler karşılaştırırken

0 Cevap php

Ben, özellikleri şu şekilde başlatılır, bir PHP nesne, var:

$this->contact = implode(PHP_EOL,$description->getContact()) . PHP_EOL;

Tek istisna version ve bugs adlı iki özelliklerdir.

Bu amaç, daha sonra bir JSON nesne içine kodlanmış ve bir formdan değeri ile karşılaştırmak JSON nesne aşağıdaki JavaScript, geçirilir.

function compareEntry(data){
        var dataProperties = ["version", "bugs", "scenario", "exception", "instruction", "sources", "risks", "test", "contact"];
        var hasChanged = false;

        for(var i = 0; i < dataProperties.length; i++){
            var dataProperty = dataProperties[i];
            alert("Original: '" + data[dataProperty] + "'\nModified: '" + document.myform[dataProperty].value + "'\nTest Value: " + (!data[dataProperty].localeCompare(document.myform[dataProperty].value)));
            if(!data[dataProperty].localeCompare(document.myform[dataProperty].value)){
                hasChanged = true;
            }
        }
[...]

version ve bugs hariç, tüm diğer özellikler textarea değeri ile karşılaştırılır.

Form alanları PHP nesne değeri ile başlatılır. Ben formu göndermek zaman fonksiyon denir. Ben herhangi bir değeri değiştirmeden formu göndermek eğer bir textarea değeri ile bir özellik karşılaştırırken, o hala bana bir false verir. Neden ve nasıl onları doğru karşılaştırabilirsiniz?

Notes: PHP Nesne aynı form ile oluşturulmuş bir MySQL girişi bir yansımasıdır. Arasında, bilgiler şifrelenir ve şifresi edildi. PHP / json nesnesi ve formun başlangıç ​​değeri aynı kaynaktan çünkü Ama bu, bir rol oynaması gerekir.

EDIT

Frode anlatıldıktan sonra, ben benim test ifadesini değiştirdiğini:

data[dataProperty].localeCompare(document.myform[dataProperty].value)!=0

Ama daha sonra ben iki discrepencies kaydetti.

  • Özellikleri version ve bugs ki o kadar iade true şimdi dönüşünü test edildiğinde false. Ama diğer özelliklerine aksine, I don't manipulate the values when I'm retrieving them from the database. özelliği versiyonunun değeri şeklinde bir select etiketi saklanır.
  • Ben yerine bana verme, textarea içinde değerin birini değiştirerek olduğumda ve garip false, bana true verir olduğunu.

Bu kullandığım tarayıcı javascript uygulanması nedeniyle olabilir bana oluştu. Ama ben aldım sonuç bunu beklendiği gibi oldukça değildir. Ben Firefox ve Chrome açıklanan davranışı var ise, IE ve Opera false (IE, bana doğru verdi karşılaştırarak version kayda değer bir istisna ile her zaman atmak o select etiketi) değerini alamadı rağmen.

Ben belki benim dizeleri karşılaştırmak için başka bir yöntem kullanmak gerekir?

EDIT 2

: WoLpH önerisini aldıktan sonra, ben test koşulu değişti

veri [dataProperty]. trim () document.myform [dataProperty]. trim ()

Döşeme () 'de anlatılan işlevi olduğu yerde this other question. Ve sonuç ben ilk EDIT vardı ne ters vardır. Chrome dışında kim rastgele boolean bulunuyor atamak gibi görünüyor. Bir şekilde benim veri gerçekten yanlış bir şey var gibi görünüyor.

Firefox (değişken data kod parçacığını) onu gördüğünüz gibi burada bir JSON nesnesi bir örnektir.

{"version":"REL-773","bugs":"20831","scenario":"THIS IS A TEST\r\n\r\nThis is the what happens: stuffs.\r\n","exception":"N\/A\r\n","instruction":"1. First Step.\r\n2. Second Step.\r\n2. Third Step\r\nIt is longer.\r\n4. Fourth Step.\r\n5. Fifth Step.\r\n6. Sixth Step.\r\n","sources":"me\r\n","risks":"High risks as it is just for testing of the web application.\r\n","test":"1. Select an entry\r\n2. Change some data such as <HOME>\/path\/\r\n3. See if the application run as expected!\r\n","contact":"me@web.de\r\n"}

EDIT 3

Iki dizeleri tüm özel karakterler kaçış işlevi escape() kullanarak, karakter %OA JSON nesne %OD%OA olarak yazılı olduğunu fark ettim. Bu bana kırpma fonksiyonu \n tarafından doğru \r\n yerine geçmez şüpheli yaptı. (Ben burada posterleri öneri sonra eklenen kırpma fonksiyonu.)

Burada kullandığım fonksiyonu şudur:

if(typeof(String.prototype.trim) === "undefined")
{
    String.prototype.trim = function() 
    {
        return String(this).replace(/^\s+|\s+$/g, '').replace(/\r\n/g,"\n");
    };
}

0 Cevap