2009-08-20 2 views
3

У меня есть простой веб-форма с кодом, как это:ASP.NET перейти на якорь в коде позади

//... 
//tons of text 
//... 
<a name="message" /> 
//... 
//tons of text 
//... 
<asp:Button ID="ButtonSend" 
       runat="server" 
       text="Send" 
       onclick="ButtonSend_Click" /> 

После POST я хочу, чтобы перейти пользователь моего «сообщение» якоря. У меня следующий код для этого:

protected void ButtonSend_Click(object sender, EventArgs e) 
{ 
this.ClientScript.RegisterStartupScript(this.GetType(), 
             "navigate", 
             "window.location.hash='#message';", 
             true); 
} 

Этот простой JavaScript не работает в Firefox 3.5.2 - URL меняется в браузере, но страница не переходите на якорь. В IE 8 он работает отлично.

Почему этот код JavaScript не работает в Firefox? Я что-то упускаю?

+0

, кажется, работает для меня ... с использованием FF 3.0.13 // IE8 оба браузера прокручиваются отлично ... я думаю, что он должен работать, но вы можете попробовать код Cleiton, если когда-либо его не –

ответ

6

Я решил свою проблему. JavaScript-код был вызван до того, как мой якорь даже существовал. Вот почему Firefox не прокрутил страницу вниз.

Мой код теперь выглядит как tihs:

this.ClientScript.RegisterStartupScript(this.GetType(), 
             "navigate", 
             "window.onload = function() {window.location.hash='#message';}", 
             true); 

После загрузки страницы я звоню мою простую функцию JavaScript.

Ключ к решению проблемы был решением Cleiton. Firebug сообщает, что getElementById возвращал нулевую ссылку. Затем я посмотрел на сгенерированный HTML, как и предложил andrewWinn - JavaScript был вызван до того, как был установлен якорь. Сделал мало поисковой системы и нашел решение.

Спасибо за ваши ответы!

+0

Если вы не укажете # в сообщении, Firefox, похоже, добавит его сам по себе. Попробовал назначить «.hash» для записи параметров запроса в URL-адрес на стороне клиента (без обновления страницы) без успеха –

4

Mendoza, вы можете использовать родной scrollIntoView функция.

Чтобы сделать то, что вы хотите, просто написать:

this.ClientScript.RegisterStartupScript(this.GetType(), 
             "navigate", 
             "document.getElementById('id_of_the_element').scrollIntoView();", 
             true); 
+0

Ваше решение не тоже работает :(Проверено на Firefox 3.5.2 и IE 8. Также протестировано на другом компьютере с Firefox 3.0.10 и IE 8 - не работает. Я просто не понимаю:/ – GTD

+0

@Mendoza, я тестировал его с IE6 и Firefox 3.5.2, и он работал нормально. Я думаю, что вы сделали что-то не так. Например, у вас якорь должен быть ID для этого решения. – Cleiton

+0

Проблема уже решена. Посмотрите на мой ответ :) – GTD

1

Я однажды столкнулся с этим. Вы взглянули на фактический HTML? Если я помню, FireFox был случайным сенсацией на якорях. Я не знаю, изменилось ли это недавно или нет.

+0

Этот ответ должен быть комментарий. Это вопрос для оригинального автора вопроса, а спекуляция с «я не знаю» – perfectionist

1

Вы можете использовать jQuery LocalScroll plugin. Используя это, можно прокручивать с помощью:

$(function() { 
    $.scrollTo("#message"); 
}); 

Или с кодом ASP.NET:

protected void ButtonSend_Click(object sender, EventArgs e) 
{ 
    this.ClientScript.RegisterStartupScript(this.GetType(), 
              "navigate", 
              "$(function() { $.scrollTo('#message'); });", 
              true); 
} 

Это не идеальное решение, особенно если вы не используете JQuery где-нибудь в вашем проекте уже, но это может решить вашу проблему.