Несколько проблем с генерацией в jQuery / Javascript

#javascript #jquery #checkbox #jquery-autocomplete

#javascript #jquery ( jquery ) #флажок #jquery-автозаполнение

Вопрос:

Я пока не очень хорошо разбираюсь в javascript, поэтому мне нужна помощь. Я начал использовать плагин jQuery Autosuggest, который позволяет мне добавлять теги (что-то вроде тегов stackoverflow). Что я хочу сделать, так это сгенерировать флажок для каждого выбранного тега. По этой причине я модифицировал плагин так, чтобы он заключал каждое имя тега в a <span class="tag tag_name">tag_name</span> , чтобы было проще получить тег, что я и делаю следующим образом: $(".tag").attr("class").replace("tag ", ""); . Во всяком случае, я написал скрипт, который генерирует флажок, но проблема в том, что он генерирует флажок только для первого тега и продолжает генерировать его каждые 2 секунды. Кроме того, я беспокоюсь, что сценарий может быть немного перегружен подготовкой? Вот сценарий:

 $(document).ready(function(){
    var done = {};
    $("input[type=text]").autoSuggest("get.php", {searchObjProps:"name", selectedItemProp:"name", asHtmlID: "1"});
    var timer = setInterval(function(){
        if(!done[city]){
            var city = $(".mestoJe").attr("class").replace("mestoJe", "");
            done[city] = true;
        }
        var nr = 0;
        $.each(done, function(i, j){
            if(j != 2){
                var tmp = $('<input type="checkbox" value="' nr '" name="city[]">' i '<br />');
                $("#checkboxes").append(tmp);
                j = 2;
                nr  ;
            }
        });
    },2000);

});
 

Любая помощь будет оценена по достоинству!

Комментарии:

1. Почему вы навсегда добавляете флажки на таймере с интервалом в 2 секунды? Почему бы просто не добавить все, что вы хотите, и готово. Почему бы не остановить таймер, когда вы закончите добавлять все флажки?

2. Как бы я это сделал? Я действительно глуп с этим: S

3. Остановка таймера clearInterval(timer) завершена .

Ответ №1:

В этой строке вашего скрипта:

 var city = $(".mestoJe").attr("class").replace("mestoJe", "");
 

вы вызываете .replace() , чтобы удалить имя класса, но не присваиваете его обратно чему-либо, поэтому на самом деле ничего не меняется. .replace() возвращает замененную строку — она не изменяет переданную.

Чтобы фактически изменить имя класса и, таким образом, перейти в следующий город при следующем срабатывании таймера, вам нужно будет использовать что-то вроде этого:

 var firstCity = $(".mestoJe").get(0);
var city = firstCity.className = firstCity.className.replace("mestoJe", "");
 

Если вы не измените имя класса, то эта строка кода будет генерировать точно такой же результат и точно такое же название города каждый раз:

 var city = $(".mestoJe").attr("class").replace("mestoJe", "");
 

Кроме того, вы запускаете 2-секундный внутренний таймер и никогда не останавливаете его, чтобы он продолжался вечно.

Вы также ссылаетесь:

 if(!done[city]){
 

прежде чем вы когда-либо определяли city .

Комментарии:

1. На самом деле, класс выглядит так: <span class="mestoJe city">city</span> , поэтому я получаю от него именно то, что хочу. И это не было проблемой в первую очередь.

2. Но вы вызываете это несколько раз при каждом таймере и каждый раз получаете один и тот же результат, потому что вы никогда ничего не изменяете: var city = $(".mestoJe").attr("class").replace("mestoJe", "");

3. Святые угодники! Сначала я не понял, что вы говорили, мой плохой. Я думал, что смогу сохранить название города, просто заменив его. На самом деле он генерирует все флажки, но не отображает только весь массив.