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

Возник вопрос по замещению глобальных переменных параметром функции.
Вот к примеру первый код:
HTML5
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
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Thief_code</title>
</head>
<body>
<script>
    var balance = 10500;
    var cameraOn = true;
 
    function steal(balance, amount){
        cameraOn = false;
        if(amount < balance){
            balance = balance - amount;
        }
        return amount;
      
    }
 
    var amount = steal(balance, 1250);
    alert("Criminal: you stole" + amount + "!");
</script>
</body>
</html>
В этом коде глобальная переменная balance замещается параметром balance в функции steal и вычисление происходит неправильно, ну или по крайней мере не так как задумывалось.

Вот второй код:

HTML5
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Bubble_sol</title>
</head>
<body>
<script>
    var scores = [60, 50, 60, 58, 54, 54,
        58, 50, 52, 54, 48, 69,
        34, 55, 51, 52, 44, 51,
        69, 64, 66, 55, 52, 61,
        46, 31, 57, 52, 44, 18,
        41, 53, 55, 61, 51, 44];
    function printAndGetHighScore(scores) {
        var highScore = 0;
        var output;
        for (var i = 0; i < scores.length; i++) {
            output = "Bubble solution #" + i + " " + "score:" + scores[i];
            console.log(output);
            if (scores[i] > highScore) {
                highScore = scores[i];
            }
        }
        return highScore;
    }
    function getBestResults(scores, highScore) {
        var bestSolutions = [];
        for (var i = 0; i < scores.length; i++) {
            if (scores[i] == highScore) {
                bestSolutions.push(i);
            }
        }
        return bestSolutions;
    }
    var highScore = printAndGetHighScore(scores);
    console.log("Bubbles test: " + scores.length);
    console.log("Highest bubble score: " + highScore);
 
    var bestSolutions = getBestResults(scores, highScore);
    console.log("Solutions with highest score: " + " " + bestSolutions);
</script>
</body>
</html>
Тут глобальная переменная highScore замещается параметром highScore в функции getBestResults, но при этом все вычисления проходят как задумано.

Вопрос: Не могу понять почему в первом примере глобальная переменная замещается и код не выполняется,а во втором примере замещение срабатывает??? о_О
Ответ: Nitro84,
Javascript
1
2
3
4
5
6
7
8
9
    var balance = 10500; // глобальная переменная
    var cameraOn = true; // глобальная переменная
 
    function steal(balance, amount){
        balance // локальная переменная, одноимённый аргумент функции
        window.balance // всегда глобальная переменная
        cameraOn // глобальная переменная, одноимённых локальных аргументов или переменных нет
        window.cameraOn // всегда глобальная переменная
    }
Вопрос: Как глобальные переменные передать функции-обработчику события в jquery

Задача стоит такая - есть четыре ссылки, внутри которых изображения.
Нужно сделать, чтобы при наведении мыши на ссылку атрибут src изображения менялся (указывал на другое изображение, с префиксом '-hover' в имени)

Вопрос в следующем - как глобальные переменные передать функции-обработчику события в jquery

CODE (html):

  1. <div class='tm-nite-icons' style='margin:auto;width:300px;'>
  2.         <a class='white0' href='#'><img src='00.png'></a><br>
  3.         <a class='white1' href='#'><img src='01.png'></a><br>
  4.         <a class='white2' href='#'><img src='02.png'></a><br>
  5.         <a class='white3' href='#'><img src='03.png'></a><br>
  6. </div>

CODE (javascript):

  1. jQuery(document).ready(function(){             
  2.                 arr = new Array('00','01','02','03');// имена файлов-картинок без расширения
  3.                 for(var i = 0; i<=3; i++){                     
  4.                         var a = '.white' + (i);//здесь хранится css класс ссылки
  5.                         var image = a + ' img';//изображение, которому будем менять атрибут src                        
  6.                         //alert (a); //работает, выводит переменную
  7.                         jQuery(a).hover(function(arr, i, image){
  8.                                 var path = '/images/' + arr[i] + '-hover.png';//при наведении мыши на ссылку, путь ведет к изображению с префиксом hover
  9.                                 //alert(path); //не работает, значение глобальной переменной arr[i] определяется как undefined
  10.                                 jQuery(image).attr('src', path);
  11.                         },
  12.                         function(arr, i, image){
  13.                                 var path = '/images/' + arr[i] + '.png';//если мышь не наведена на ссылку, путь ведет к изображению без префикса hover
  14.                                 jQuery(image).attr('src', path);
  15.                         });
  16.                 }
  17.         });

(Отредактировано автором: 06 Мая, 2015 - 10:50:09)

Ответ:
Они и так "глобальные", не нужно их передавать в аргументах калбяка.


-----
Вопрос: Глобальные переменные в JavaScript

Мне нужна такая глобальная переменная js, чтобы можно было сохранять значение между загрузками страниц. Скажем, ввел, что-то в форму или поле на странице, перешел на другую страницу и можно было извлечь это значение из нее. И так между переходами с одной страницы на другую. Глобальные переменные не подойдут, при загрузке страницы заново они обнуляются или инициализируются дефолтными значениями.
Ответ: В дополнение к предыдущему ответу, опишу вкратце каждый механизм.
Все вышеперечисленные вещи хранятся на компьютере пользователя и привязываются к текущему домену или url. Все они могут быть только строковыми величинами.
Cookie: передаются на сервер при КАЖДОМ обращении к веб-серверу. Таким образом они по умолчанию доступны на сервере в суперглобальной переменной $_COOKIE (PHP). Могут быть установлены/изменены/удалены по указанию сервера или на клиенте. Имеют сильные ограничения по размеру хранимых данных и по количеству. Можно задать время, через которое cookie автоматически уничтожатся, либо они уничтожатся при завершении текущей сессии (закрытии веб-страницы).
LocalStorage: в отличие от cookie - локальное хранилище не передаётся на сервер по умолчанию. Сохраняется на компьютере на неограниченное время и может быть удалено/изменено/сохранено только средствами JS на клиенте. Размер хранимых данных условно неограничен (ограничен в разумных пределах).
SessionStorage: то же самое, что и LocalStorage, только хранимые данные уничтожаются при завершении сессии.
Вопрос: В теле функции изменить глобальную переменную

Добрый день!

Имеется файл main.js в котором объявлена глобальная (?) переменная data, и функция mainLoad c вложенной функцией от requirejs, в теле которой я хочу сделать присвоение значения этой глобальной переменной data.

Затем, глобальная переменная data из main.js будет использоваться другим скриптом call.js, скажем, для вывода этой data.
Т.е. инициализируется глобальная переменная - в неё из функции записывается значение, это значение обрабатывается потом другим скриптом. Код ниже, под спойлером.

Кликните здесь для просмотра всего текста
HTML
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Sketch</title>
    <link rel="stylesheet" href="style.css">
    <script src="http://requirejs.org/docs/release/2.2.0/minified/require.js"></script>
</head>
<body>
<div>
Text
</div>
</body>
    <!--my js file-->
    <script type="text/javascript" src="main.js"></script>
    <script type="text/javascript" src="call.js"></script>
</html>
main.js
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
30
31
32
33
34
35
var data = []; //глобальная (?) переменная
window.onload = mainLoad();
 
function mainLoad(){    
    //get the data from bib.js file
    require(
        ['bib'],
        function(bib){
            var entries = bib.entries;
 
            data=numb_per_year(1990,6,entries);
        }); 
        console.log(data); //не работает
}
 
/*function to count how many articles were published in each year 
  starting from start_year and ending with start_year+period-1  */
function numb_per_year(start_year,period,entries){
    var array = []; //array to store number of articles for each year
    var years = []; //array to store list of years to compare with
    years[0]=start_year; //set the first year
            
    for(var i=1;i<period;i++) //full year-array with years from strat_year to start_year+(period-1)
        years[i]=years[i-1]+1;
            
    //make all the values = 0 in an array
    for(var i=0;i<years.length;i++)
        array[i]=0;
 
    for (var i=0;i<years.length;i++)
        for (var el in entries)
            if(entries[el].year==years[i])
                array[i]+=1;
    return array;
}
call.js
Javascript
1
console.log(data); //тоже не работает
bib.js
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
define({ entries : {
    "Book1": {
        "author": "John Smith",
        "title": "The best book ever",
        "year": "1995"
    },
    "Book2": {
        "author": "Tom Moscow",
        "title": "The second one",
        "year": "1995"
    },
    "Book3": {
        "author": "Ahmed, Adel and Fu, Xiaoyan and Hong, Seok-Hee and Nguyen, Quan Hoang and Xu, Kai",
        "title": "Visual analysis of history of {World Cup}: A dynamic network with dynamic hierarchy and geographic clustering",
        "year": "1994"
    },
    "Book4": {
        "author": "Kitch Saw",
        "title": "Applications of languages",
        "year": "1994"
    }
}});
Жалкие попытки вывести хоть что-то:
main.js
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var data=[];
window.onload = mainLoad();
 
function mainLoad(){    
    //get the data from bib.js file
    require(
        ['bib'],
        function(bib){
            var entries = bib.entries;
 
            data=numb_per_year(1990,6,entries);
            console.log(data); //выводит
        }); 
        console.log(data); //не выводит
}
Результат:
main.js:12 []
call.js:1[]
main.js:14 [0, 0, 0, 2, 2]


Кстати, вот не знаю, почему, но при выводе оно сначала выводит console.log(data) из main.js на строке 12, затем из call.js, и только потом console.log(data) из main.js на строке 14.


P.S. почитала литературу и сообщество веб-разработчиков настоятельно рекомендует, по возможности не использовать глобальные переменные. Как можно было бы это обойти в моём случае (оставив присвоение в теле функции и вывод значения другим скриптом)?
Ответ: function(bib)
это колбек(функция обратного вызова), которая передается в виде параметра в функцию require
принцип здесь таков, файл подгрузился и только тогда выполняется функция function(bib){}
Javascript
1
2
3
4
5
6
7
8
9
10
function mainLoad()
{   
    require( ['bib'], test); 
}
function test(bib){
    var entries = bib.entries;
    data=numb_per_year(1990,6,entries);
    console.log(data); //выводит
    foo();
}
Вопрос: Запись полученных данных в глобальную переменную

Здравия желаю!

Через $.get-запрос получаю ссылки с указанной страницы и поэтапно добавляю их в блок #DivCache:

PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
<div id="DivCache"></div>
 
<script type="text/javascript">
 var NextURL = "/blog/kategorija-1/"; // Адрес страницы, с которой берутся ссылки
 
 $.get(NextURL, function(data) {
     $("span.eTitleblog a", data).each(function(){
       myHTML = "<a href=\"" + $(this).attr("href") + "">" + $(this).html() + "</a>";
       $("#DivCache").append(myHTML).append("<br>");
     }); // END $("span.eTitleblog a", data).each(function()
 }); // END $.get(NextURL, function(data)
</script>
Данный вариант работает. Но есть необходимость все ссылки, полученные в $.get-запросе, передать в некую глобальную переменную, а уже ее значение, после некоторой обработки, вывести на экран. Пробовал сделать так:

PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="DivCache"></div>
 
<script type="text/javascript">
 var NextURL = "/blog/kategorija-1/"; // Адрес страницы, с которой берутся ссылки
 var mySTR = "";
 
 $.get(NextURL, function(data) {
     $("span.eTitleblog a", data).each(function(){
       mySTR += "<a href=\"" + $(this).attr("href") + "">" + $(this).html() + "</a><br>";
     }); // END $("span.eTitleblog a", data).each(function()
 }); // END $.get(NextURL, function(data)
 
   $("#DivCache").append(mySTR);
</script>
Однако в этом случае ничего не выводится на экран. Пробовал при объявлении переменной mySTR задавать ей не пустое начальное значение, оно-то и выводится по выполнению скрипта. То есть получается, что для "$.get(...)" и "$(...).each(...)" переменная mySTR является локальной. Как сделать, чтобы она вела себя в данном случае, как глобальная переменная?
Ответ: Спасибо. Кажется, понял. Возникнут вопросы, вернусь
Вопрос: После AJAX пропадает глобальная переменная

Вопрос на засыпку)))
Есть форма, которая выводиться при загрузке страницы( объявляется глобальная переменная ). После через select AJAX`ом подгружаем еще форму( должна глобальная переопределиться ), где есть второй SELECT, который AJAX`ом должен подгружать из глобальной измененные данные первого AJAX`са, но глобальная исчезает...

P.S. проверяю в конце кода первого AJAX - есть и переопределилась, но в самом начале второго - уже её нет. ( убрал все wp_die(); , но без результатно )

Вопрос... Может в вордпрессе есть какие-либо нюансы по этому поводу, ну или в самом AJAX`се?

Добавлено через 44 минуты
И да... глобальная переменная PHP.

Добавлено через 37 минут
PHP
1
2
3
4
5
6
7
if( !isset( $my_global_var ) )
  $my_global_var = '1';
echo '<select id="#my_select_1">';
   echo '<option value="option1">option1</option>';
   echo '<option value="option2">option2</option>';
echo '</select>';
echo '<div id="div_form"></div><div id="div_form_2"></div>';
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
30
31
32
( function( $ ) {
   $( document ).on( 'ready', function(){
      $( document ).on( 'change', "#my_select_1", function(){
         var id = this.value;
 
         data = {
                      action  : 'function_for_ajax_1',
                      this_id : id,
                      nonce  : aero_ajaxurl.nonce
                    }
         $.post( aero_ajaxurl.url, data, function( response ){
            $( "#div_form" ).html( response );
         } ).success( function(){
            // ...
         } );
      } );
      $( document ).on( 'change', "#my_select_2", function(){
         var id = this.value;
 
         data = {
                      action  : 'function_for_ajax_2',
                      this_id : id,
                      nonce  : aero_ajaxurl.nonce
                    }
         $.post( aero_ajaxurl.url, data, function( response ){
            $( "#div_form_2" ).html( response );
         } ).success( function(){
            // ...
         } );
      } );
   } );
})(jQuery);
PHP
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
if (defined('DOING_AJAX')) {
    add_action( 'wp_ajax_function_for_ajax_1', 'function_for_ajax_1' );
    add_action( 'wp_ajax_nopriv_function_for_ajax_1', 'function_for_ajax_1' );
 
    add_action( 'wp_ajax_function_for_ajax_2', 'function_for_ajax_2' );
    add_action( 'wp_ajax_nopriv_function_for_ajax_2', 'function_for_ajax_2' );
}
function function_for_ajax_1(){
    if ( ! wp_verify_nonce( htmlentities($_POST['nonce']), 'aero-nonce' ) ){
        echo 'error';
        wp_die();
    }
        ob_start();
    global $my_global_var;
    $my_global_var = '2';
        // ...
        var_dump( $my_global_var ); // 2
}
function function_for_ajax_2(){
    if ( ! wp_verify_nonce( htmlentities($_POST['nonce']), 'aero-nonce' ) ){
        echo 'error';
        wp_die();
    }
        ob_start();
    global $my_global_var;
        var_dump( $my_global_var ); //empty???
        // ...
}
Эти действия последовательны, без других действий между ними
P.S. это просто пример, что б логика действий было понятна, возможно, где-то опечатался, но в оригинале опечаток, вроде, нет)

Добавлено через 20 минут
Т.е. в начале второго AJAX`са глобальная равна "1", так как в начале есть...
PHP
1
2
if( !isset( $my_global_var ) )
  $my_global_var = '1';
Если убрать, то будет пустой

Добавлено через 5 минут
Есть у кого-то какие-то мысли? Вопрос вот в чем, может быть это из-за AJAX( jQuery ) или WP+AJAX( jQuery ) ? Если нет, то буду сам искать причину в другом месте...

Добавлено через 2 часа 33 минуты
Всем спасибо за внимание, решил проблему иным способом...
Ответ: Так работает PHP. При каждом запросе на сервер приложение запускается, отрабатывает и умирает. Естественно, данные в памяти не хранятся, удаляются. Их нужно хранить в базе данных. Также можно использовать куки, или передавать данные о состоянии с клиентской страницы на бекэнд.
Вопрос: Глобальные переменные в JS

<div id="my"></div>

var ClickCounter = 0;

document.addEventListener("click", function(e) {
    ClickCounter++;
    document.getElementById('my').innerHTML = ClickCounter;
});

Говорят глобальные переменные это зло. Как в этом случае сделать не глобальной переменную ClickCounter?
Ответ:
Сообщение от Safort
Сохрани результат в какое-нибудь общее хранилище, которое доступно глобально и уже из него бери нужные данные.
приведите, плз, пример общего хранилища
Вопрос: Как заставить функцию при запуске увидеть ГЛОБАЛЬНУЮ переменную?

Друзья! По загрузке документа ззапускается функция test(), которая должна видеть ГЛОБАЛЬНУЮ переменную
Возможно ли такое? НЕ видит напрочь! Вот код
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
<script>
 var per= document.getElementById("ima")
 function test () {
  //var per= document.getElementById("ima")
  //СЕйчас эта переменная не видна! Но если объявить её локальной, тоона будет видна
  per.value="конец"
 }
</script> 

</head>

<body onload="test()">
<input name="ima" type="text" id="ima" value="начало" />
</body>
</html>


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

А если по другому объявить используемую переменную (локальной),то изменяет.

Но мне надо чтобы она видела именно глобальную переменную озможно ли такое? И если нет. сразу вопрос- как быть? Я предполагаю использовать несколько функций, использующих одни и те же значения. И что мне теперь, для каждолй функции объявлять локальные переменные? Несерьёзно как-то. Извините, если что не так. Спасибо.
Ответ:
Сообщение от Tim
Выриант 2:
function test()
{
	per.value="конец";
}


onload = function()
{
	per = document.getElementById("ima");
	test();
}
дать бы по рукам за гениальность )

правильное решение передачи данных в функцию из вне

function test(){
	var per = "конец";
	return per;
}


function test2(){
	alert(test());
}
Вопрос: Глобальные переменные в расширении Chrome

Сделал совсем простое расширение для Chrome: по нажатию комбинации клавиш добавляет URL текущей вкладки в подобие блокнота. Сохраненные URL хранятся в глобальной переменной, которая объявляется в фоновом скрипте background.js (как я думал он исполняется только один раз при загрузке расширения). Так вот эта переменная периодически сбрасывается, то есть скрипт background.js периодически перезагружается. Почему? Как этого избежать? Или где объявить переменную что бы она не сбрасывалась пока запущен браузер или загружено расширение.

manifest.json
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
30
{
    "name": "Имя",  //имя
    "description": "Описание",  //описание
    "version": "1.0",   //версия расширения
 
    "content_scripts":
    [
        {
            "all_frames": true, //er546
            "matches": ["*://*/*"], //вставляем на все страницы
            "js": ["hotkeys.js"],   //, //скрипт, добавляющий поддержку горячих клавиш
            "run_at": "document_end"
        }
    ],
    "permissions":  //
    [
        "tabs"
    ],
    "background":
    {
        "persistent": false,
        "scripts": ["background.js"]    //скрипт работающий в фоновом режиме
    },
    "browser_action":
    {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "manifest_version": 2   //версия манифеста
}
popup.js
Javascript
1
2
3
4
5
6
7
8
9
10
//alert("alert");
 
var alluri = chrome.extension.getBackgroundPage().allurl;
document.getElementById('edit1').textContent = alluri;
 
 
chrome.browserAction.onClicked.addListener(function(callback)
    {
        document.getElementById('edit1').textContent = chrome.extension.getBackgroundPage().allurl;
    });
hotkeys.js
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
if (!EXT_HOTKEY_JS_INSERTED)
{
    var EXT_HOTKEY_JS_INSERTED = true;
    var hotkeys = '';
    var messages = '';
    var timeout = '';
    
    document.addEventListener('keydown', event_handleKeyDownEvent, true);
 
    function event_handleKeyDownEvent(e)
    {
        var c=0;
        var a=0;
        var s=0;
        var k = e.keyCode;
        if (e.shiftKey) s = 1;
        if (e.altKey) a = 1;
        if (e.ctrlKey) c = 1;
        if ((k==49) && (!c) && (!s) && (a))
        {
            var luri = window.document.documentURI;
            chrome.runtime.sendMessage({greeting: "adduri", uri: luri}, function(response)
            {
            }); 
        };
    };
};
background.js
Javascript
1
2
3
4
5
6
7
8
9
10
//alert("background.js");
var allurl;
 
chrome.runtime.onMessage.addListener(function(request, sender, callback)
{
    if (request.greeting=="adduri")
    {
        allurl = allurl + request.uri + String.fromCharCode(13) + String.fromCharCode(10);
    };
});
popup.html
Javascript
1
2
3
4
5
6
7
8
9
10
<html>
    <head>
        <meta charset="utf-8">
        <title>Мои заметки</title>
    </head>
    <body>
        <textarea id="edit1" cols=35 rows=20></textarea>
    </body>
    <script src="popup.js"></script>
</html>
Ответ: А вот и нет . Если бы это было так меня бы все устроило, именно на это я и рассчитывал при написании расширения, но...
В моем случае по какой-то причине скрипт background.js выполняется когда посылается сообщение, обработчик которого объявлен в background.js (но не каждый раз, а через некоторый период времени, около минуты).

Добавлено через 6 минут
Обратите внимание на листинг background.js, который я выложил. Если раскоментировать первую строку, то окно сообщения будет всплывать не один раз при загрузке расширения, а случайным образом при нажатии Alt+1 (этой комбинацией посылается сообщение для сохранения URL текущей вкладки).
Вопрос: $('.class') как глобальная переменная

Всем доброго времени суток. Подскажите пожалуйста как сделать $('.class') глобальной переменной. К примеру

var TegOne = $('.class');


function log(){
	console.log(TegOne.html());
}

function ale(){
	alert(TegOne.attr('class'))
}

$(document).ready(function(){

ale();

log();

});




Я понимаю что в функцию можно передать переменную ( ale(TegOne); ).
И то если поместить в ready
$(document).ready(function(){

    var TegOne = $('.class');
    ale(TegOne);

});


Но как то можно изначально так объект поместить в переменную и пользоваться на протяжении всего файла?

Заранее большое спасибо
Ответ: Белый шум,
Можно и
TegOne = $('.class');