Събитие за въвеждане на jQuery, задействано при контейнер в IE

Имам поле за въвеждане със събитие input, обвързано с него (чрез jQuery). Това събитие трябва да се задейства всеки път, когато входната стойност се промени. Добавих контейнер, за да кажа на потребителя за какво е това поле за въвеждане.

Ако потребителят щракне върху това поле за въвеждане, събитието input НЕ трябва да се задейства (стойността всъщност не се променя; просто контейнерът изчезва). Работи добре във Firefox или Chrome, но не и в IE.

Как мога да избегна това поведение?

За по-добро разбиране на проблема ми в jsfiddler


person lionheart98    schedule 10.10.2013    source източник
comment
в коя версия на IE се случва това?   -  person Olrac    schedule 10.10.2013
comment
@OLRAC в IE10, работещ на Windows 8   -  person lionheart98    schedule 10.10.2013
comment
значи казваш, че проблемът ти е контейнерът?   -  person Olrac    schedule 10.10.2013
comment
точно така, просто премахнете елемента placeholder в моя пример за jsfiddler и ще видите, че всичко работи както трябва   -  person lionheart98    schedule 10.10.2013
comment
вашият jsfiddle работи като чар с моя току-що изтеглен ie10..може би трябва да актуализирате вашия ie 10..   -  person Olrac    schedule 14.10.2013
comment
сериозно? Току-що актуализирах IE до v10.0.10. Все още не работи правилно. Само за да се уверя, че ме разбирате правилно: проблемът ми е, че IE задейства събитието за въвеждане, дори ако потребителят просто въведе полето за въвеждане (и не е написал нищо). Появява ли се 0, ако просто щракнете върху полето за въвеждане, но не сте въвели нищо?   -  person lionheart98    schedule 14.10.2013
comment
добре.. видях го сега.. защо не искате да показвате 0 на първия вход..?   -  person Olrac    schedule 14.10.2013
comment

Прегледайте стойностите и използвайте set, за да проследите това, което вече сте видели. Веднага щом видите стойност отново, върнете True:

def has_duplicates(lst):
    seen = set()
    for elem in lst:
        if elem in seen:
            return True
        seen.add(elem)
    return False

Това е много ефективно, тъй като предизвиква късо съединение; няма да премине през целия списък, ако дубликат е открит рано.

  -  person Olrac    schedule 14.10.2013
comment
Благодаря ви за отговора! за съжаление събитията keyup/press, change, paste и cut не са толкова мощни, колкото събитието input (т.е. всички те не разпознават събития undo/redo; input го прави). Знаете ли обаче някакъв по-интелигентен начин за обвързване на тези събития въз основа на браузъра, въпреки че използвате потребителския агент?   -  person lionheart98    schedule 14.10.2013
comment
между другото защо не искам да показвам 0: това е просто прост пример за моя проблем. В момента използвам събитието за въвеждане, за да проверя формуляр за въвеждане и да проверя дали е празен. Така че не е красиво, ако съобщенията за грешка се появяват само защото потребителят е въвел полето за въвеждане, но не е направил никакви промени в действителната му стойност.   -  person lionheart98    schedule 14.10.2013
comment
Това е грешка в IE 10/11: connect.microsoft.com/IE/feedback/details/810538/   -  person Ian Kemp    schedule 15.10.2015


Отговори (2)


Един от начините да се предпазите от проблема е като съхраните старата стойност на вашето поле и я проверите, преди да изпълните истинската функция, която искате да изпълните във вашия манипулатор input. Ето как го поправих в едно от моите приложения.

Например:

$(document).ready(function () {
    var $input = $("#input");
    var $msg = $("#msg");
    var old_value = $input.val();
    $input.on("input", function () {
        var new_value = $input.val();
        if (new_value !== old_value) {
            // The actual work we want to perform when the field *really* changes.
            $msg.text(new_value.length);
            old_value = new_value;
        }
    });
});

Това предотвратява действието, когато полето не се променя.

person Louis    schedule 05.09.2014
comment
Как да се предпазим от това входно събитие, което предотвратява други събития? Имам връзка с офериране за кликване, която се спира от това събитие за въвеждане :( Потребители се оплакват, че трябва да кликнат два пъти в IE, докато в други браузъри работи добре. - person Azimuth; 02.09.2016
comment
@Azimuth Никога не съм имал проблем с игнорирането на кликвания. Това, което кодът в отговора прави, е само да слуша input събития и това няма ефект върху начина, по който се обработват click събития. Изглежда, че може да имате материал за нов въпрос. - person Louis; 02.09.2016
comment
@Louis Yepp, ще създам въпрос - person Azimuth; 02.09.2016

опитайте да добавите това към входното събитие:

if($(this).val() == $(this).get(0).defaultValue) return;
person MoLow    schedule 07.09.2014