Добавление объектов в массив javascript и последующий доступ к ним в том же файле .js - PullRequest
1 голос
/ 26 января 2011

Долго читатель, первый постер!

Я пытаюсь добавить объекты Div в массив и пытаюсь получить к ним доступ позже, когда вызываю функцию loadViews.Все мои оповещения срабатывают в правильном порядке, но массив m_Divs всегда имеет длину 0. И я в замешательстве.

Я каждый раз перезаписываю скрипт на Page_Load, потому что он выбрасывает«Ошибка: ожидается объект» после каждой загрузки страницы при попытке вызвать javascript, если я этого не сделаю.

.JS файл.

var m_Divs = new Array();

function switchViews(obj) {
    alert("switchViews!");
    var div = document.getElementById(obj);
    var img = document.getElementById('img' + obj);

    if (div.style.display == "none") {
        alert("adding div" + div);
        window.m_Divs.push(div);
        alert("added");
    }
    else {}
}

function loadViews() {
    alert(window.m_Divs.length);
    for (i = 0; i < window.m_Divs.length; i++) {
        window.m_Divs[i].style.display="";
    }
}

переключение представлений запускается через

<a href="javascript:switchViews('div<%#Eval("ID")%>');">

внутри GridView.

.CS File

protected void Page_Load(object sender, EventArgs e)
{
    Page.ClientScript.RegisterClientScriptInclude("TheScript", "Scripts/TheScript.js");

    if (!Page.IsPostBack)
    {
         // Stuff.
    }
}

Соответствующий код файла .aspx

<script type="text/javascript" src="Merge.js"></script>
<body onload = "loadViews()">
  <form id="form1" runat="server">

Ответы [ 3 ]

0 голосов
/ 26 января 2011

Отсутствует постоянство на странице каких-либо объектов JavaScript, поэтому каждый раз, когда вы перезагружаете страницу (включая обратную передачу), выполнение JavaScript и любые значения переменных, которые вы устанавливаете, будут сбрасываться.

Если вы хотите, чтобы ваши данные сохранялись между загрузками страниц, вам придется хранить данные где-то в постоянном месте, например, в базе данных. Вам придется написать код на стороне сервера, чтобы сделать это.

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

  1. Сохраните данные в скрытом поле, как предложено @Tor
  2. Измените свою страницу, чтобы она не делала никаких обратных возвратов (читайте в Ajax, используя jQuery или аналогичный)
  3. Использование ASP.NET UpdatePanel s для частичной обратной передачи страницы, которая по сути такая же, как и у других методов Ajax, за исключением того, что вы сможете получить доступ к своей форме в обработчиках событий на стороне сервера (это неэффективно, но, возможно, в в этом случае вам все равно), и среда JavaScript останется нетронутой.
0 голосов
/ 27 января 2011

http://www.thomasfrank.se/sessionvars.html#comment158

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

RegisterHiddenField и RegisterClientScriptInclude требовали, чтобы я повторно объявлял их каждый Page_Load, что приводило к сбросу значения каждый раз. И Ajax, похоже, не любит интеграцию с этим конкретным проектом, он был запущен еще тогда, когда был выпущен .net 2.0. Целая другая банка червей.

Мне также пришлось начать хранить переменную "obj" в массиве, а не переменную "div", так как объект div был слишком сложным, чтобы его можно было так разыграть.

Спасибо за помощь, ребята, я бы проголосовал, если бы моя учетная запись была достаточно привилегированной =)

0 голосов
/ 26 января 2011

Сохраните значения между постбэками, например, с помощью метода RegisterHiddenField на ClientScript.

http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.registerhiddenfield.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...