Действительно ли приемлемо сделать цель внешних ссылок = “_blank”?

Для.NET 2.0, вот хороший бит кода, я записал, что это делает точно, что Вы хотите, и работы для любого свойства на Control:

private delegate void SetControlPropertyThreadSafeDelegate(
    Control control, 
    string propertyName, 
    object propertyValue);

public static void SetControlPropertyThreadSafe(
    Control control, 
    string propertyName, 
    object propertyValue)
{
  if (control.InvokeRequired)
  {
    control.Invoke(new SetControlPropertyThreadSafeDelegate               
    (SetControlPropertyThreadSafe), 
    new object[] { control, propertyName, propertyValue });
  }
  else
  {
    control.GetType().InvokeMember(
        propertyName, 
        BindingFlags.SetProperty, 
        null, 
        control, 
        new object[] { propertyValue });
  }
}

Вызов это как это:

// thread-safe equivalent of
// myLabel.Text = status;
SetControlPropertyThreadSafe(myLabel, "Text", status);

при использовании.NET 3.0 или выше Вы могли бы переписать вышеупомянутый метод как дополнительный метод Control класс, который тогда упростит вызов до:

myLabel.SetPropertyThreadSafe("Text", status);

ОБНОВЛЕНИЕ 10.05.2010:

Для.NET 3.0 необходимо использовать этот код:

private delegate void SetPropertyThreadSafeDelegate<TResult>(
    Control @this, 
    Expression<Func<TResult>> property, 
    TResult value);

public static void SetPropertyThreadSafe<TResult>(
    this Control @this, 
    Expression<Func<TResult>> property, 
    TResult value)
{
  var propertyInfo = (property.Body as MemberExpression).Member 
      as PropertyInfo;

  if (propertyInfo == null ||
      !@this.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
      @this.GetType().GetProperty(
          propertyInfo.Name, 
          propertyInfo.PropertyType) == null)
  {
    throw new ArgumentException("The lambda expression 'property' must reference a valid property on this Control.");
  }

  if (@this.InvokeRequired)
  {
      @this.Invoke(new SetPropertyThreadSafeDelegate<TResult> 
      (SetPropertyThreadSafe), 
      new object[] { @this, property, value });
  }
  else
  {
      @this.GetType().InvokeMember(
          propertyInfo.Name, 
          BindingFlags.SetProperty, 
          null, 
          @this, 
          new object[] { value });
  }
}

, который использует LINQ и лямбда-выражения для разрешения намного более чистого, более простого и более безопасного синтаксиса:

myLabel.SetPropertyThreadSafe(() => myLabel.Text, status); // status has to be a string or this will fail to compile

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

, К сожалению, это не мешает никому делать глупые вещи, такие как передача в другом Control свойство и значение, таким образом, следующее счастливо скомпилирует:

myLabel.SetPropertyThreadSafe(() => aForm.ShowIcon, false);

Следовательно я добавил проверки на этапе выполнения, чтобы гарантировать, что переданный - в свойстве действительно на самом деле принадлежит Control что то, что метод был обращенным. Не прекрасный, но еще намного лучше, чем.NET 2,0 версии.

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

5
задан Robert Greiner 28 August 2009 в 20:00
поделиться

12 ответов

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

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

РЕДАКТИРОВАТЬ: Лучшая информация, которую я прочитал по этой теме, находится в книге Стива Круга «Не заставляйте меня думать» ( веб-сайт ).

8
ответ дан 18 December 2019 в 05:18
поделиться

Most people will say to leave it out, all for very good reasons.

Most people will not tell you this: watch how different people browse using their computer. Sit down for an hour with an average user: a teacher, a piano player, a retired Vet, a stay-at-home mother, or a mechanic. Watch how people who are disabled browse.

You will discover that you should not:

  • Open new windows (it is highly confusing)
  • Have menus disappear immediately after leaving them (requires fine motor control)
  • Use excessive numbers of links on a page (also confusing)
  • Provide too many features and options
  • Use Flash animation
  • Be overly clever

You will discover that you should:

  • Be clear and concise
  • Be simple
  • Keep the user on the same page
  • Avoid frustrating the end user at any cost
  • Create an extremely responsive website

And much more.

10
ответ дан 18 December 2019 в 05:18
поделиться

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

8
ответ дан 18 December 2019 в 05:18
поделиться

Не указывайте целевой атрибут и позвольте пользователям решать, хотят ли они открывать ссылку в новом окне. Если вы хотите предупредить пользователя о том, что ссылка уведет его с вашего сайта, вы можете создать страницу, которая проясняет это (например, на сайтах правительства США).

3
ответ дан 18 December 2019 в 05:18
поделиться

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

3
ответ дан 18 December 2019 в 05:18
поделиться

Here is a nice write up for not opening links in a new window/tab from Smashing Magazine. Essentially, it is better to give users control over link behavior than to decide for them.

2
ответ дан 18 December 2019 в 05:18
поделиться

Usability guru (?) Jakob Nielsen suggests not opening new browser windows (It's 10 years old though).

Quote:

Opening up new browser windows is like a vacuum cleaner sales person who starts a visit by emptying an ash tray on the customer's carpet. Don't pollute my screen with any more windows, thanks (particularly since current operating systems have miserable window management). If I want a new window, I will open it myself!

Designers open new browser windows on the theory that it keeps users on their site. But even disregarding the user-hostile message implied in taking over the user's machine, the strategy is self-defeating since it disables the Back button which is the normal way users return to previous sites. Users often don't notice that a new window has opened, especially if they are using a small monitor where the windows are maximized to fill up the screen. So a user who tries to return to the origin will be confused by a grayed out Back button.

And, every rule has an exception: He suggests document like PDF or DOC that are opened in the browser should be opened in new windows, to avoid confusion.

2
ответ дан 18 December 2019 в 05:18
поделиться

Стоит отметить, что цель в любом случае недопустима в XHTML.

2
ответ дан 18 December 2019 в 05:18
поделиться

Это зависит от того, как правило, для ссылок на дополнительный контент на вашем сайте я бы не использовал _blank. Каждый раз, когда я ссылаюсь на сторонний контент, я использую _blank, чтобы страница моего сайта оставалась открытой. Таким образом, когда пользователь закончит работу с внешним сайтом, он снова увидит мой сайт.

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

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

1
ответ дан 18 December 2019 в 05:18
поделиться

Люди ненавидят открывать ссылки в новом окне и не знать, что они появятся. Для каждой внешней ссылки используйте target = "_ blank", но добавьте значок, предлагающий открыть новое окно. Двойной квадратный значок Википедии является хорошим примером этого, так что вы можете просто взять его у них и извлечь выгоду из грамотности, которая уже есть у пользователей.

Что хорошо в значке «нового окна», так это то, что у пользователей есть возможность выбрать вместо этого открытие в новой вкладке, что не так навязчиво. Я бы также сказал, что многие из тех, кто яростно спорят против предлагаемого вами подхода, смотрят на него строго с точки зрения эстетики / удобства использования, а не с точки зрения бизнес-требований или функциональности вашего собственного приложения.

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

1
ответ дан 18 December 2019 в 05:18
поделиться

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

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

0
ответ дан 18 December 2019 в 05:18
поделиться

Думаю, это зависит от ситуации. Для простого веб-сайта с несколькими ссылками, например, о нас, контактах, услугах и т. Д., Я не буду открывать новое окно. Пользователю легко узнать, на какой странице он находится и какую страницу только что просмотрел. Для сайта, на котором есть сводная страница листинга, которая ссылается на сотни или даже тысячи отдельных страниц листинга. Я бы предпочел открывать новое окно для каждого объявления. Это позволяет пользователям сравнивать услугу / цену .... на каждой открытой странице. Кроме того, пользователю не нужно нажимать кнопку «назад», чтобы вернуться на страницу сводки и ждать, пока та же страница загрузится снова.

2
ответ дан 18 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: