Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   В чем ошибка (https://javascript.ru/forum/misc/67545-v-chem-oshibka.html)

MixPetrov 23.02.2017 12:08

В чем ошибка
 
Значение через
$('input[name=\'' + product_id + '\']').val()
получается, а вот изменение и подстановка не нового значения в value не выполняется.

function isright(product_id) {
	var ns = $('input[name=\'' + product_id + '\']').val().value.replace(/\D/g,'')||0;
	if (ns>50)	ns=$('input[name=\'' + product_id + '\']').val(50);	
	if (ns<10)  ns=$('input[name=\'' + product_id + '\']').val(10);
	$('input[name=\'' + product_id + '\']').val() = ns
}

рони 23.02.2017 12:16

MixPetrov,
http://api.jquery.com/val/

рони 23.02.2017 12:20

MixPetrov,
:(
function isright(product_id) {
	var ns = +($('input[name=\'' + product_id + '\']').val().replace(/\D/g,''))||0;
	if (ns>50)	ns=50;	
        if (ns<10)  ns=10;
	$('input[name=\'' + product_id + '\']').val(ns) }

MixPetrov 23.02.2017 12:37

Спасибо огромное!
А вот почему происходит следующее: при вводе допустим 15 выпадает сразу 50.

рони 23.02.2017 12:45

MixPetrov,
проверьте пост №3 снова

рони 23.02.2017 12:58

MixPetrov,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    function isright() {
        var ns = +this.value.replace(/\D/g, "") || 0;
        if (ns > 50) ns = 50;
        if (ns < 10) ns = 10;
        this.value = ns
    }
    var timer;
    $(".num").on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(isright.bind(this), 1200)
    })
});
  </script>
</head>

<body>
<input class="num">
<input class="num">
</body>
</html>

MixPetrov 23.02.2017 13:04

В общем проблема в том, не происходит сброс в валуе в ноль и автоматом считает что вводишь не 15, а 1015.
Но если убрать нижний предел то все отлично. Еще раз спасибо.
И еще маленький вопрос если в php в div class'e в value задать атрибут maximum передастся ли он параметром в функцию "function isright(product_id), maximum"?

рони 23.02.2017 13:15

MixPetrov,
не понимаю, но лучше использовать input type=number c min и max

MixPetrov 23.02.2017 13:34

Лучше, но в данном случае надо через input type=text.

По "И еще маленький вопрос...."

Сам input
<input name="1" oninput="isright(1); recalc(1);" size="2" value="1" maximum="4" type="text">

<input name="2" oninput="isright(2); recalc(2);" size="2" value="1" maximum="125" type="text">

<input name="3" oninput="isright(3); recalc(3);" size="2" value="1" maximum="76" type="text">


maximum="4" = maximum="<?php echo $product['quantity']; ?>"

Предастся ли maximum="4" в код js через параметр функции
"function isright(product_id, maximum) {...} ?

Или как передать значение maximum?

рони 23.02.2017 13:56

MixPetrov,
да

MixPetrov 23.02.2017 14:10

Пробовал так:
function isright(product_id, maximum) {
	var ns = +($('input[name=\'' + product_id + '\']').val().replace(/\D/g,''))||0;
	if (ns>maximum)	ns=maximum;	
        //if (ns<10)  ns=10;
	$('input[name=\'' + product_id + '\']').val(ns) }

Так:
function isright(product_id, maximum) {
	var ns = +($('input[name=\'' + product_id + '\']').val().replace(/\D/g,''))||0;
	var ms = $('input[name=\'' + product_id + '\']').val(maximum);
	if (ns>ms)	ns=ms;	
        //if (ns<10)  ns=10;
	$('input[name=\'' + product_id + '\']').val(ns) }

Так:
function isright(product_id, maximum) {
	var ns = +($('input[name=\'' + product_id + '\']').val().replace(/\D/g,''))||0;
	if (ns>$('input[name=\'' + product_id + '\']').val(maximum);)	ns=$('input[name=\'' + product_id + '\']').val(maximum);;	
        //if (ns<10)  ns=10;
	$('input[name=\'' + product_id + '\']').val(ns) }

Не получилось

рони 23.02.2017 14:22

MixPetrov,
1 вариант должен работать

MixPetrov 23.02.2017 14:27

Увы(

рони 23.02.2017 14:31

MixPetrov,
сложно ввести число, когда скрипт мешает ... но всё работает
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>

  function isright(product_id, maximum) {
  var ns = +($('input[name=\'' + product_id + '\']').val().replace(/\D/g,''))||0;
  if (ns>maximum)	ns=maximum;
        //if (ns<10)  ns=10;
  $('input[name=\'' + product_id + '\']').val(ns) }
$(function() {

   isright(1,4) //test


});
  </script>
</head>

<body>
<input name="1"  oninput="isright(1,4);" size="2" value="89998мимими" maximum="4" type="text">

</body>
</html>

MixPetrov 23.02.2017 14:47

Работает замечательно, maximum срабатывает один для всех, а как передать этот параметр для конкретного inputa?

рони 23.02.2017 15:16

Цитата:

Сообщение от MixPetrov
а как передать этот параметр для конкретного inputa?

строка 27 -- в чём проблема?

MixPetrov 23.02.2017 15:25

Понял, Огромное спасибо!!! Все работает!

MixPetrov 24.02.2017 11:18

Подскажите можно ли каким то образом через событие oninput получить в округление полное значение value?
в данном случае округление срабатывает, но каждая введенная цифра округляется отдельно. К примеру при вводе 11 получается 33 т.е. первая 1 округляется до 3 и вторая единица тоже округляется до 3.
Через событие onchange работает правильно, но хотелось бы через oninput.


<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>

  function mathC(nmb, rnd) {
  var ns = +$('input[name=\'' + nmb + '\']').val();
  ns = ns || 0;
  ns = Math.ceil(ns/rnd)*rnd;
  $('input[name=\'' + nmb + '\']').val(ns) }
$(function() {

   mathC(1,3) //test


});
  </script>
</head>

<body>
<input name="1"  oninput="mathC(1,3);" size="2" value="1" type="text">

</body>
</html>

рони 24.02.2017 11:38

MixPetrov,
можно ввести задержку, смотрите пост №6

MixPetrov 24.02.2017 12:12

Через файл *.js

$ (function	() {
	function mathC(product_id, nmb){
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
		}
		var timer;
		$('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
    })
});


Через *.php

<script type="text/javascript">
$ (function() {
$('.quantity_cart input[type="text"]').on("input", function() {
		var timer;
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
    })
	});
	</script>


Не срабатывает

рони 24.02.2017 12:24

MixPetrov,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$ (function	() {
  function mathC(){
    var nmb = +this.dataset.nmb;
    var ns = +this.value;
    ns = ns || 0;
    ns = Math.ceil(ns/nmb)*nmb;
    this.value = ns
    }
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
    })
});

  </script>
</head>

<body class="quantity_cart">
<input name="1"   size="2" value="1" type="text" data-nmb="3">
<input name="1"   size="2" value="1" type="text" data-nmb="3">
</body>
</html>

MixPetrov 24.02.2017 14:29

Не работает
А можно ли к функции подключить таймер без
$('.quantity_cart [type="text"]').on("input", function()


$ (function	() {
  function mathC(){
    var nmb = +($('input[name=\'' + product_id + '\']').val().dataset.nmb);
   // var ns = +this.value;
    //ns = ns || 0;
    //ns = Math.ceil(ns/nmb)*nmb;
    //this.value = ns
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
	}
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
    })
});

рони 24.02.2017 14:34

MixPetrov,
пас

MixPetrov 24.02.2017 15:17

Подскажите в чем делаю ошибку?
$ (function	() {
  function mathC(){
    var nmb = +($('input[name=\'' + product_id + '\']').val().dataset.nmb);
   // var ns = +this.value;
    //ns = ns || 0;
    //ns = Math.ceil(ns/nmb)*nmb;
    //this.value = ns
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
	}
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
    })
});

рони 24.02.2017 15:36

MixPetrov,
вы пишите бред, переменная product_id с неба прилетит.
Цитата:

Сообщение от MixPetrov
Не работает

если здесь работает то и у вас будет работать

MixPetrov 24.02.2017 15:44

Согласен с выше написанным.

В файле js
$ (function	() {
  function mathC(product_id, nmb){
    var nmb = +($('input[name=\'' + product_id + '\']').val().dataset.nmb);
   // var ns = +this.value;
    //ns = ns || 0;
    //ns = Math.ceil(ns/nmb)*nmb;
    //this.value = ns
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
	}
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC, 1200)
    })
});


В файле php (firebug)

<div class="quantity_cart">
<span class="minus" onclick="quantity(2, '-10', '20', '125')"><</span>
<input name="2" oninput="mathC(2,10); isright(2,125,20); recalc(2);" size="2" value="20" maximum="125" quantity="125" minimum="10" data-nmb="10" type="text">
<span class="plus" onclick="quantity(2, '+10', '10', '125')">></span>
</div>

рони 24.02.2017 15:47

MixPetrov,
не будет работать

MixPetrov 24.02.2017 15:50

Куда копать?

рони 24.02.2017 16:10

MixPetrov,
https://learn.javascript.ru/events-and-interfaces
https://learn.javascript.ru/event-details
https://learn.javascript.ru/attribut...tom-properties

MixPetrov 24.02.2017 16:21

Спасибо

MixPetrov 24.02.2017 16:48

Можете дать ссылки на информацию о передаче переменных и их значений между файлами. Буду очень признателен.

рони 24.02.2017 17:13

MixPetrov,
я не могу вам помочь.

MixPetrov 24.02.2017 17:26

На самом деле Вы уже очень помогли.

Скажите почему так работать не будет?

В файле js
$ (function	() {
  function mathC(product_id, nmb){
    var nmb = +($('input[name=\'' + product_id + '\']').val().dataset.nmb);
   // var ns = +this.value;
    //ns = ns || 0;
    //ns = Math.ceil(ns/nmb)*nmb;
    //this.value = ns
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
	}
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC, 1200)
    })
});


В файле php (firebug)

<div class="quantity_cart">
<span class="minus" onclick="quantity(2, '-10', '20', '125')"><</span>
<input name="2" oninput="mathC(2,10); isright(2,125,20); recalc(2);" size="2" value="20" maximum="125" quantity="125" minimum="10" data-nmb="10" type="text">
<span class="plus" onclick="quantity(2, '+10', '10', '125')">></span>
</div>


:thanks:

Пойду азы изучать

рони 24.02.2017 17:33

Цитата:

Сообщение от MixPetrov
Скажите почему так работать не будет?

Цитата:

Сообщение от рони
переменная product_id с неба прилетит.

:(

выберите что-то одно либо onclick, либо addEventListener, либо jquery -- лучше addEventListener

MixPetrov 24.02.2017 17:54

oninput="mathC(2,10);
где 2 = <?php echo $product['product_id']; ?> - переменная product_id

MixPetrov 25.02.2017 10:32

Переменные передаются округление работает, не подключается settimeout

MixPetrov 26.02.2017 16:30

Ребят, помогите объясните где не так делаю, уже в голове не то что каша а пена просто. 

	$ (function	() { 
		function mathC(product_id, nmb){ // сюда не приходят значения product_id и nmb
		var nmb = +($('input[name=\'' + product_id + '\']').val().dataset.nmb); // здесь похоже не правильно
		var ns = +$('input[name=\'' + product_id + '\']').val();
		ns = ns || 0;
		ns = Math.ceil(ns/nmb)*nmb;
		$('input[name=\'' + product_id + '\']').val(ns)
		}
		var timer;
		$('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC, 1200)
		})
	});
		
		<div class="quantity_cart">
		<input type="text" name="product_id" oninput="mathC($product_id,$nmb);" size="2" value="20" maximum="125" quantity="125" minimum="10" data-nmb="10" type="text">
		</div>

Paguo-86PK 26.02.2017 16:36

Цитата:

Сообщение от MixPetrov (Сообщение 445544)
Ребят, помогите объясните где не так делаю, уже в голове не то что каша а пена просто.

Пo-моему, setTimeout получает ссылку на инкапсулированную функцию.:blink:

рони 26.02.2017 16:52

Paguo-86PK,
ему надо чтобы данные из oninput перекочевали в jquery --- все возможные решения уже даны в теме, но не помогло, тс продолжает лепить отсебятину, хаотически смешивая все варианты.

MixPetrov 26.02.2017 20:58

рони,
Спасибо! нашел свою ошибку задержка срабатывает отлично.
А можно ли скриптам задать порядок выполнения.
скрипты в *.js выполняются первыми.

Можно ли в
<div class="quantity_cart">
		<input type="text" name="product_id" size="2" value="20" maximum="125" quantity="125" minimum="10" data-nmb="10" type="text">
		</div>

указать скриптам последовательность выполнения?
Что б было как то так:
<input type="text" name="product_id" size="2" oninput="function(mathC);function(is);recalc(product_id)" value="20" maximum="125" quantity="125" minimum="10" data-nmb="10" type="text">


<script type="text/javascript">
$ (function	() {
  function mathC(){
    var nmb = +this.dataset.nmb;
    var ns = +this.value;
    ns = ns || 0;
    ns = Math.ceil(ns/nmb)*nmb;
    this.value = ns
	//alert(nmb);
    }
    var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(mathC.bind(this), 1200)
		//alert($('.quantity_cart [type="text"]'));
    })
});
  </script>
	
		<script type="text/javascript">
$ (function	() {
	function is() {
	var maximum = +this.dataset.maximum;
	var minimum = +this.dataset.minimum;
	var ns = +this.value.replace(/\D/g, "") || 0;
	if (ns>maximum)	ns=maximum;	
    if (ns<minimum)  ns=minimum;
	this.value = ns
	alert(maximum);
	}
	var timer;
    $('.quantity_cart [type="text"]').on("input", function() {
        window.clearTimeout(timer);
        timer = window.setTimeout(is.bind(this), 1400)
		//alert($('.quantity_cart [type="text"]'));
    })
});
  </script>


Часовой пояс GMT +3, время: 12:57.