2017-01-31 4 views
0

Я пробил головой над этим. Я не хочу выполнять функции PHP для создания файлов cookie. Функции javascript определены чуть выше внутри документа JQuery. Библиотеки JQuery загружаются практически обо всех этих функциях javascript.Браузер говорит, что функция не указана

<script type="text/javascript"> 
    $(document).ready(function() { 

    function superadmin() 
    { 
     document.cookie = "user=superadmin"; 
     window.location = "list.php"; 
    } 

    function user() 
    { 
     document.cookie = "user=user"; 
     window.location = "list.php"; 
    }  
    }); 
</script> 
<script type='text/javascript'> 
    $(document).ready(function() { 
    superadmin(); 
    }); 
</script>  

<div class="container"> 
+1

Параметр 'superadmin' функция Известно только внутри сначала '$ (document) .ready (function() {...})' block. Он не существует за его пределами, поэтому вы не можете его вызывать из второго блока $. Document .ready (function() {...}) '. –

+1

Можете ли вы переместить суперадмин и функции пользователя? Не внутри document.ready – cbalakus

+0

Я удалил superadmin и пользовательские функции, как вы предложили cbalakus, и теперь отлично работает. Можете ли вы опубликовать свой ответ ниже, чтобы я мог отметить его как решенный? Благодарю. – mahen23

ответ

3

Функциональные декларации контекстными функции они объявлены.

superadmin определяется в анонимную функцию, которая передается ready() поэтому нельзя вызывать вне этой анонимной функции.

Первый, удалите это:

<script type='text/javascript'> 
    $(document).ready(function() { 
    superadmin(); 
    }); 
</script>  

Второй, поставить вызов superadmin();внутри существующей готовой функции обработчика событий.

-1

Я сделал cookes в JavaScript таким путем

function setCookie(cname, cvalue, exdays) { 
    var d = new Date(); 
    d.setTime(d.getTime() + (exdays*24*60*60*1000)); 
    var expires = "expires="+d.toUTCString(); 
    document.cookie = cname + "=" + cvalue + "; " + expires; 
} 

function getCookie(cname) { 
    var name = cname + "="; 
    var ca = document.cookie.split(';'); 
    for(var i = 0; i < ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0) == ' ') { 
      c = c.substring(1); 
     } 
     if (c.indexOf(name) == 0) { 
      return c.substring(name.length, c.length); 
     } 
    } 
    return ""; 
} 

function checkCookie() { 
    var user = getCookie("username"); 
    if (user != "") { 
     alert("Welcome again " + user); 
    } else { 
     user = prompt("Please enter your name:", ""); 
     if (user != "" && user != null) { 
      setCookie("username", user, 365); 
     } 
    } 
} 

function deleteCookie(name) { 
    document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 
} 

setCookie("userid",14); 
setCookie("username","rajesh"); 

var userid = getCookie("userid"); 
var username = getCookie("username"); 
+0

Почему отрицательный голос? –

+0

Этот код (а) не затрагивает актуальную проблему, и (б) не пытается выполнить то, что пытается сделать существующий код – Quentin

+0

, но сэр, я просто хочу сказать ему, как я это сделал правильно: вы можете здесь проверить: https://sabakuch.com/music/ –

0

Это проблема, связанная с областью javascript. Событие jquery document.ready использует отдельную область, поэтому, если вы создаете переменную там, к ней нельзя получить доступ из других мест.

Решение этой задачи заключается в создании пространства имен, которое в этой ситуации является объектом, в который вы присоединяете переменную. Указанная проблема может быть решена следующим образом:

<script type="text/javascript"> 

var Namespace = {}; 

$(document).ready(function() { 

    Namespace.superadmin = function() 
    { 
    document.cookie = "user=superadmin"; 
    window.location = "list.php"; 
    } 

    Namespace.user = function() 
    { 
    document.cookie = "user=user"; 
    window.location = "list.php"; 
    }  
}); 
</script> 
<script type='text/javascript'> 
$(document).ready(function() { 
    Namespace.superadmin(); 
}); 
</script>  

<div class="container"> 

EDIT:

Для конкретной ситуации выше, решение, отправленный Квентин лучше. Это приемлемое решение, предполагающее, что вы не можете избежать двух отдельных слушателей (возможно, в разных файлах). Разумеется, вы также можете использовать область, доступную с обеих областей, что в этой ситуации является областью окна.

+0

У вас здесь много красных сельдей.Решение, которое вы действительно демонстрируете, заключается в том, чтобы * использовать глобальный *, и вы бросаете пространства имен в миксе, поэтому вы используете один глобальный вместо двух (поскольку глобальные переменные являются неприятными и чем меньше у вас есть), но нет необходимости использовать любые глобальные переменные. Использование 'document.ready' вокруг определений функций здесь совершенно бессмысленно - просто определение функции не нуждается в доступе DOM, поэтому ожидание DOM для завершения построения до определения функций раздувается. – Quentin

+0

Конечно, лучше не использовать глобальные переменные, но если у вас есть необходимость хранить вещи в отдельных файлах или слушателях, то это будет приемлемым вариантом, я думаю. Однако я согласен с тем, что вызов функции в одном слушателе лучше. – Drago96