Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Скрипт выполняется не в ожидаемом порядке

Всем привет, у меня скрипт выполняется в неожидаемом порядке по какой причине так может происходить?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var email = document.getElementById("tMail").value;
        var tst = email.search(/^[a-z0-9_]+?@[a-z0-9_]+\.[a-z]{2,4}$/g);
 
        if (tst != 0) {
            var emailGood = false;
        } else {
            
            $.ajax({
                url: $('#checkEmail').val(),
                type: "POST",
                data: { email : email },
                success: function(data) {
  console.log(data);       
 
                    if (data == '0') {
                        var emailGood = true;
                    } else {
                        var emailGood = false;
                    }
  
                }
            });  
        } 
console.log(emailGood);  
 
 
// в консоли получаю в разном порядке из-за чего скрипт работает неверно, в data с аякса должен быть 0 а получаю undefined а после это как-будто выполняется скрипт в обратном порядке
// получаю undefined 
// 0
Ответ: sendxt, что? О каком функционале речь? Я просто написал, что data у вас != '0'. Других вариантов нет.
Вопрос: Использования скрипта 1 раз с 1 ip

Добрый день.
Хочу написать скрипт для предоставления определённого процента скидок, чтобы человек нажимал "получить скидку" и там ему выдавалась скидка от 5% до 25% процентов. Естественно, чем выше процент, тем ниже шанс. Но, это не суть. Как запретить использовать скрипт повторно?
Ответ:
Сообщение от Konark
Так все же, как?
Вы хотите знать, как это можно провернуть на клиенте и именно с IP адресом? Ну, хозяин-барин... Вариант первый - добавляете на страницу:
HTML5
1
<script src="http://ip-jobs.staff-base.spb.ru/ip.cgi"></script>
После чего, в скриптах ниже, будет доступна переменная IP, содержащая тот самый IP-адрес посетителя. Вариант второй - с помощью ajax-запроса по этой ссылке , получаете некоторые гео-данные пользователя, в которых так же присутствует его IP. Следующим шагом, проверяется в выбранном вами хранилище (cookie, localStorage, etc.) наличие этого адреса. Если его нет, то запускаете ваш "одноразовый" сценарий и записываете IP-адрес в хранилище. При следующем посещении, т.к. адрес уже будет присутствовать, сценарий не отработает.

Добавлено через 3 минуты
P.S. Если вам всё равно выгодно раздавать скидки, то зачем мучения с IP? Устанавливайте метку в те же cookie и никакого головняка вам, а пользователям, лишний десяток скидок, тоже в радость будет

Добавлено через 26 минут
Ах, да. Совсем забыл про несколько браузеров на одном компе. Просто когда затея не серьёзная, то мозг не напрягаешь )) Для хранилища будете использовать . Что это такое, можно . И на всякий случай, забегая вперед, если спросите по поводу нескольких компов, например в одной квартире, то ответ будет: "Никак", если мы всё еще говорим о клиентской части.
Вопрос: При повторном вызове скрипт выполняется два-три раза

Доброго времени суток!

Есть всплывающая форма, которая по клику запускается и в ней работает навигация по изображениям. Когда закрываю ее и повторно запускаю, то скрипт выполняющий навигацию выполняется 2 раза, если еще раз закрыть и открыть, то уже три. Если я правильно понял, то дело в кеше, его нужно как то чистить, но только для отдельного блока.
код такой
$('.port-item').mouseenter(function() {
      $(this).children('.port-item-button').fadeIn("slow");    
                  
    });
    $('.port-item').mouseleave(function() {
       $(this).children('.port-item-button').fadeOut("slow");    
                  
    });

    $('.port-item-button').on("click",function(){
      $(".fon").fadeIn(200);
      $(this).addClass('wrap-popup');
      $('.wrap-popup + .port-item-wrap').fadeIn("slow").addClass("active");

          $(".port-item-wrap.active .port-wrap-img img").not(":first").hide();
            $(".port-item-wrap.active .port-wrap-galery img").click(function() {
              $(".port-item-wrap.active .port-wrap-galery img").removeClass("active").eq($(this).index()).addClass("active");
              $(".port-item-wrap.active .port-wrap-img img").hide().removeClass("act").eq($(this).index()).fadeIn(100).addClass("act");              
            }).eq(0).addClass("active");

            $(".port-item-wrap.active .brr i").click(function(){
               var 
                    slide = 0;
                    slide = $(".port-item-wrap.active .port-wrap-galery img.active").index(),
                   slideNum = $(".port-item-wrap.active .port-wrap-galery img").length;
              if (slide < slideNum-1) {
              // $(".port-item-wrap.active .port-wrap-galery .active").removeClass("active").next().addClass("active");
              // $(".port-item-wrap.active .port-wrap-img .act").removeClass("act").next().addClass("act").fadeIn(100);
              alert(slide);
              $(".port-item-wrap.active .port-wrap-galery img").removeClass("active").eq(slide+1).addClass("active");
              $(".port-item-wrap.active .port-wrap-img img").hide().removeClass("act").eq(slide+1).fadeIn(100).addClass("act");  


              }
              else {
                return false;
              }
            });
            $(".port-item-wrap.active .br i").click(function(){
              var slide = $(".port-item-wrap.active .port-wrap-galery img.active").index();
              // alert(slide);
              if (slide > 0) {
                $(".port-item-wrap.active .port-wrap-galery .active").removeClass("active").prev().addClass("active");
                 $(".port-item-wrap.active .port-wrap-img .act").removeClass("act").hide().prev().addClass("act").fadeIn(100);
                 var slide = 0;
                
               }

               else {
                return false;
         }
      }); 
         
    });

    //закрытие 

    $(".fon").click(function(){
      $(this).fadeOut(200);
      $(".port-item-wrap.active .port-wrap-galery img").removeClass("active").find(":first").addClass("active");      
      $(".port-item-wrap.active .port-wrap-img img").removeClass("act").addClass("act");
      $(".port-wrap-img img.act").fadeIn(100);

      $(".port-item-wrap").removeClass("active").fadeOut(200);

      $(".port-item-button").removeClass("wrap-popup");

     

    });
Ответ: komned37,
Клик внутри клика у тебя. Вынеси их отдельно друг от друга, кеш тут не причем:
$('.port-item-button').on("click",function(){
});


$(".port-item-wrap.active .port-wrap-galery img").click(function() {
});

$(".port-item-wrap.active .brr i").click(function(){
})
Вопрос: Скрипт выполняется 2 раза!

Добого времени суток всем! Написал несложный скрипт, который должен, при наведении мышкой на геообъект запомнить его графические настройки, потом изменить их, а когла мышь покинет контуры геообъекта - вернуть запомненные настройки обратно. Однако столкнулся со сложностью: два раза выполняется событие и значение пресета графического, который нужно было запомнить, переписывается при втором выполнении. Подсккжите почему так и как это можно исправить?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            var $ = jQuery;
            $('#geofield-ymap-catalog-page').bind('yandexMapInit', function (event, map) {
                var pr='default';
                map.geoObjects.events
                    .add('mouseenter', function (e) {
                        if(pr == 'custom#hover'){
                            alert(pr);
                        }
                        else{
                            pr = e.get('target').options.get('preset');
                            e.get('target').options.set('preset', 'custom#hover');
                        }  
                    })
                    .add('mouseleave', function (e) {
                        e.get('target').options.set('preset', pr);
                        pr1 = false;
                    });
            });
Добавлено через 11 минут
Такой вариант еще есть

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var $ = jQuery;
            $('#geofield-ymap-catalog-page').bind('yandexMapInit', function (event, map) {
                var pr = 'default',pr1;
                map.geoObjects.events
                    .add('mouseenter', function (e) {
                        if(pr != 'custom#hover'){
                            pr1 = e.get('target').options.get('preset');
                            e.get('target').options.set('preset', 'custom#hover');
                            pr = 'custom#hover';
                        }
                    })
                    .add('mouseleave', function (e) {
                        e.get('target').options.set('preset', pr1);
                    });
            });
Ответ: Попробуйте просто убрать первую строку.
Вопрос: В этом скрипте выполняется разворачивание блока при клике

проблема такая.. на странице находится несколько блоков content1 и при клике на read-next разворчиваются сразу все блоки..Подскажите как сделать чтоб разворачивался определенный блок при клике а не все разом??

$(function ()
{ var h = 500, t = $('.content1'), max = t[0].scrollHeight, min = 570;
$('.read-next').on('click', function (event)
{
var H = t.height();
if(H == max){H = min}
else if (H + h > max){H = max}
else {H += h};
t.height(H);
$(this).text(H == max ? 'Скрыть' : 'Читать далее...')
return false
})
})
Ответ:
Сообщение от sad67man
Сам не очень силен в js, но есть такой вариант, думаю вам нужно обрамить контент с ссылкой в какой-нить див и сделать что-то типо этого
спасибо))
Вопрос: Переместить скрипт с одного сайта на другой

Здравствуйте ребят, со скриптами первый раз сталкиваюсь, не знаю какую тему правильно выбрать, но суть вопроса в следующем:

Есть скрипт который показывает видео с ютуба в качестве фона для сайта,
скачал исходники с этим скриптом, вроде понастраивал, работает...

появилась потребность применить этот скрипт на другом сайте, но как я только не копировал
этот скрипт, как не пытался вставить, не показывает и все тут...
Может где то с ошибкой записываю, но вроде все один в один из сайта с исходником...

Помогите разобраться прилагаю 2 архива, 1 где этот скрипт работает, 2 где он не хочет работать.

Ответ: Сначала я подумал о сложном исходнике в виде целого архива папок и файлов. (раньше пришлось иметь дело - тоже вставлял видео в качестве фона) А теперь оглашу список того, что не хватает, чтобы работал архив под названием "Не работает.rar":
1) index.html - строка 95: не хватает закрывающей прямоугольной скобки для тега <div>. (В работающем архиве тоже её нет, но и ток работает.)
2) HTML-комментарии допускается вставлять только за пределами HTML-тегов, а не внутри. У Вас же <!--Вот этот скрипт по идее--> находится внутри тега <div>, который отвечает за работу плеера. Просто удалите.
3) Не подключена библиотека JQuery. У Вас есть файл libs/jquery/jquery-1.11.2.min.js Вот его и подключите:
HTML5
1
<script src="libs/jquery/jquery-1.11.2.min.js"></script>
4) Файл js/common.js После первой строки добавьте это: (оно есть в одноимённом файле работающего архива)
Javascript
1
2
3
4
5
    if (!device.tablet() && !device.mobile()) {
        $(".player").mb_YTPlayer();
    } else {
        //Если мобильние девайсы
    };
И будет всё работать.

Добавлено через 12 минут
Я по ошибке написал "не хватает закрывающей прямоугольной скобки для тега <div>". На самом деле - треугольной скобки. (знак "больше")
Вопрос: Выполнение скрипта несколько раз на одной страницы.

Рубята помогите пожалуйста, сразу скажу что в js ни бум бум.

На сайте магазина сделал такую штуку.
В категории где отображаются товары у каждого товара есть главная картинка и снизу три дополнительных. при нажатии на дополнительную картинку она встает на место главной. но вот беда при нажатии на дополнительную картинку она встает на место главной но сразу у всех товаров.

вот страничка 40amperТОЧКАruСЛЕШelektro

Что? Во что обернуть, что-бы изолировать друг от друга.

Сам скрипт.

jQuery(document).ready(function() {
Virtuemart.updateImageEventListeners()
});
Virtuemart.updateImageEventListeners = function() {
jQuery("a.vm-additional-images").fancybox({
"titlePosition" : "inside",
"transitionIn" : "elastic",
"transitionOut" : "elastic"
});
jQuery(".additional-images a.product-image.image-0").removeAttr("rel");
jQuery(".additional-images img.product-image").click(function() {
jQuery(".additional-images a.product-image").attr("rel","vm-additional-images" );
jQuery(this).parent().children("a.product-image").removeAttr("rel");
var src = jQuery(this).parent().children("a.product-image").attr("href");
jQuery(".main-image img").attr("src",src);
jQuery(".main-image img").attr("alt",this.alt );
jQuery(".main-image a").attr("href",src );
jQuery(".main-image a").attr("title",this.alt );
jQuery(".main-image .vm-img-desc").html(this.alt);
});

}

Поможите пжлста!
Спасибо!
Ответ: pavelrer,
Чтобы найти нужный вам конкретный объект, надо от текущего this добраться до их общего родителя
(img.product-image->div.floatleft->div.additional-image->div.spacer blc_good - третий родитель)
и внутри родителя найти нужный элемент, т.е что-то вроде
jQuery(this).parent().parent().parent().find(".main-image img").attr("src",src);
Вопрос: Запуск скрипта написанного в текстовом поле

Решил написать "велосипед". Понятно, что уже что-то подобное существует, но в образовательных целях все равно решил написать.
Суть такова: на странице есть textarea в которой набирается скрипт, затем этот скрипт вставляется в iframe на этой же странице и по идее должен выполняться по кнопке.
обычный html получается вставить, а со скриптами проблема.
1. как вставить содержимое в iframe? я так пробую
Javascript
1
2
3
4
5
6
7
8
var code = document.getElementById('code');
function ScriptRun(){
        'use strict;'
    let code = document.getElementById['code'];// получаю текст из текстэреа
    
    let frame = document.getElementById('frame');
    frame.srcdoc ='<body><script type="text/javascript" async>' + code.value + '<\/script><\/body>';
}
не получается
2. атрибут name это тоже что и id?
3. где-то читал, что если сделать (function(){})(); то скрипт выполняется сразу.
4. скрипт, который в боди грузится выполняется автоматически же?
вроде все читал, но от большого количества инфы уже путаться начал, поэтому решил сразу прояснить.
Ответ: для исполнения javascript-кода <iframe> не нужен
достаточно создать в любом месте страницы новый тег <script> и прописать его свойству text javascript-код из <textarea>

работающий код см.
Вопрос: Вставить остановку в скрипт для фотошопа

у меня есть скрипт для фотошопа с вызовом модального окна.
(здесь сокращенное окошко)
нужно чтобы скрипт не выполнялся дальше, если нажата кнопка cancel
сообщение "поехали дальше" - не должно выводится
подскажите, как это можно сделать или где прочитать

function OknoVvodSlov1(){ }
OknoVvodSlov1.prototype.run = function() {
    var retval = true;
    //описание  окна
    function createOkno() {
        var myOkno = new Window('dialog', 'Ввод данных для серии 1');
        // добавляем панель с кнопками
        myOkno.knopki = myOkno.add('group');
        myOkno.knopki.orientation = "row";
        myOkno.knopki.okBtn = myOkno.knopki.add('button', undefined, 'Применить', {name:'ok'});
        myOkno.knopki.cancelBtn = myOkno.knopki.add('button', undefined, 'Cancel', {name:'cancel'});
        return myOkno;
        }
    //описание  окна закончилось
    //
    //
    //--------------------Основная программа---------------------//
    // Создали окно
    var vvod = createOkno();
    //Показали окно
    function runVvod(vvod) {
        return vvod.show();
        }
    // Реакция кнопок.  
    if (runVvod(vvod) == 1 ){
        alert("Нажали ОК");
        }else{
            alert("Надо бы остановится!!!!");
            // Вот тут надо вставить остановку скрипта
            // Но не знаю как
            }
    return retval;
    }

/**
 "Основная программа ": построит анонимный экземпляр и будет запусткать его
   до тех пор, как мы не unitTest этот фрагмент
*/

if(typeof(OknoVvodSlov1_unitTest)  == "undefined") {
    new OknoVvodSlov1().run();
}
// Скрипт выполняется далее
alert ("поехали дальше!");
Ответ: Вот такое сообщение фотошоп выдает

Вопрос: Выполнение php скрипта на локальной станции, бред?

Сразу скажу, я знаю, что php скрипты выполняются ТОЛЬКО на сервере.

Обратился ко мне заказчик. Лет-лет назад я делал ему сайт и использовал в анкор вызов js-функции, ну и не только в анкор. Заказчик где-то прочел, что хакеры в отладчике напр. в Firebug добираются до этого анкора и меняют обращение к ф-ции на алерт и в этот алерт, якобы, вставляют чтение сессионных переменных.
Ну чтобы изменить анкор в памяти своего компьютера это крутейшим хакером нужно быть, вероятно. А вот насчет алерта сомнения, я уверен, что в алерт нельзя в отладчике всунуть php скрипт, который будет выполняться на стороне пользователя. Насколько я понимаю, это концепция php, выполнение только на стороне сервера, а клиенту болт.
Кроме того, сессионая переменная создается после входа с паролем, а никак не до.
Но заказчик настаивает убрать вызовы ф-ций именно по причине возможности взлома.
Убрать, разумеется, можно, но это время. Сайт не маленький.

Заранее спасибо!
Ответ: Zzepish, я почти тоже самое заказчику сказал, он читает в сети всякий бред...
Всем спасибо за поддержку!!!