Что означает & ldquo; javascript: void (0) & rdquo; имею в виду?

Итак, скажем, у вас есть Activity AB, который контролирует Frag A и Fragment B. Внутри фрагмента A вам нужен интерфейс, который может реализовать Activity AB. В примере кода android у них есть:

private Callbacks mCallbacks = sDummyCallbacks;

/ * Интерфейс обратного вызова, который должен реализовывать все действия, содержащие этот фрагмент. Этот механизм позволяет уведомлять действия о выборе элементов. * /

public interface Callbacks {
/*Callback for when an item has been selected. */    
      public void onItemSelected(String id);
}

/*A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity. */    
private static Callbacks sDummyCallbacks = new Callbacks() {
    @Override
    public void onItemSelected(String id) {
    }
};

Интерфейс обратного вызова помещен в один из ваших фрагментов (скажем, фрагмент A). Я думаю, что цель этого интерфейса Callbacks - как вложенный класс внутри Frag A, который может реализовать любая активность. Так, если Fragment A был телевизором, CallBacks - это ТВ-пульт (интерфейс), который позволяет Фрагменту A использовать Activity AB. Возможно, я ошибаюсь в деталях, потому что я нооб, но у меня есть программа, которая отлично работает на всех размерах экрана, и это то, что я использовал.

Итак, внутри фрагмента A мы имеем: (I взяли это из программных приложений Android)

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
//mCallbacks.onItemSelected( PUT YOUR SHIT HERE. int, String, etc.);
//mCallbacks.onItemSelected (Object);
}

И внутри Activity AB мы переопределим метод onItemSelected:

public class AB extends FragmentActivity implements ItemListFragment.Callbacks {
//...
@Override
//public void onItemSelected (CATCH YOUR SHIT HERE) {
//public void onItemSelected (Object obj) {
    public void onItemSelected(String id) {
    //Pass Data to Fragment B. For example:
    Bundle arguments = new Bundle();
    arguments.putString(“FragmentB_package”, id);
    FragmentB fragment = new FragmentB();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container, fragment).commit();
    }

Итак, внутри Activity AB вы в основном бросаете все в Bundle и передавая его B. Если вы не уверены, как использовать Bundle, посмотрите класс вверх.

Я в основном придерживаюсь образца кода, который предоставил Android. Тот, у кого есть материал DummyContent. Когда вы создаете новый пакет приложений для Android, он называется MasterDetailFlow.

1229
задан Ondra Žižka 3 October 2017 в 13:07
поделиться

5 ответов

Оператор void оценивает данный выражение, а затем возвращает undefined .

Оператор void часто используется просто для получения примитива undefined значение, обычно используя « void (0) » (который эквивалентно « void 0 »). В этих случаях вместо этого можно использовать глобальную переменную undefined (при условии, что она не был назначен нестандартным значение).

Здесь приводится объяснение: void operator .

Причина, по которой вы хотите сделать это с помощью href ссылки, заключается в том, что обычно URL javascript: перенаправляет браузер на текстовую версию результата оценки этого JavaScript. Но если результат undefined , тогда браузер останется на той же странице. void (0) - это всего лишь короткий и простой скрипт, который оценивается как undefined .

975
ответ дан 19 December 2019 в 20:16
поделиться

Вы всегда должны иметь href в ваших тегах a . Вызов функции JavaScript, которая возвращает undefined, подойдет. То же самое и со ссылкой на '#'.

К тегам привязки в Internet Explorer 6 без href не применяется стиль a: hover .

Да, это ужасное и незначительное преступление против человечности , но опять же, как и Internet Explorer 6.

Надеюсь, это поможет.

Internet Explorer 6 на самом деле является серьезным преступлением против человечества.

43
ответ дан 19 December 2019 в 20:16
поделиться

ОГРОМНАЯ разница в поведении "#" и javascript: void

"#" прокручивает вас в ВЕРХ страницы в то время как "javascript: void (0);" нет.

Это очень важно, если вы кодируете динамические страницы. пользователь не хочет возвращаться наверх только потому, что щелкнул ссылку на странице.

70
ответ дан 19 December 2019 в 20:16
поделиться

Значит, ничего не будет. Это попытка сделать так, чтобы ссылка никуда не «перемещалась». Но это неправильный путь.

На самом деле вы должны просто вернуть false в событии onclick , например так:

<a href="#" onclick="return false;">hello</a>

Обычно он используется, если ссылка выполняет какой-то 'JavaScript -y 'вещь. Например, отправка формы AJAX, замена изображения или что-то еще. В этом случае вы просто выполняете любую вызываемую функцию return false .

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

<a href="backup_page_displaying_image.aspx"
   onclick="return coolImageDisplayFunction();">hello</a>
120
ответ дан 19 December 2019 в 20:16
поделиться

В дополнение к техническому ответу, javascript: void означает, что автор делает это неправильно.

Нет веских причин использовать javascript: псевдо-URL (*). На практике это вызовет путаницу или ошибки, если кто-то попробует такие вещи, как «ссылка на закладку», «открыть ссылку в новой вкладке» и т. Д. Это происходит довольно часто, теперь люди привыкли к средней щелчке для новой вкладки: это похоже на ссылку, вы хотите прочитать ее в новой вкладке, но оказывается, что это совсем не настоящая ссылка, и дает нежелательные результаты, такие как пустая страница или ошибка JS при щелчке средней кнопкой мыши.

- распространенная альтернатива, которая, возможно, может быть менее плохой. Однако вы должны не забывать возвращать false из обработчика событий onclick , чтобы предотвратить переход по ссылке и прокрутку вверх страницы.

В некоторых случаях может возникнуть ошибка фактическое полезное место, на которое можно указать ссылку. Например, если у вас есть элемент управления, при нажатии на который открывается ранее скрытый

, имеет смысл использовать ссылку на него. Или, если есть способ сделать то же самое не с использованием JavaScript (например, 'thispage.php? Show = foo', который устанавливает foo видимым для начала), вы можете ссылаться на него.

В противном случае, если ссылка указывает только на какой-то скрипт, на самом деле это не ссылка, и его не следует размечать как таковую. Обычный подход - добавить onclick к ,

или без href и стилизуйте его так, чтобы было понятно, что вы можете щелкнуть по нему. Это то, что StackOverflow [сделал на момент написания; теперь он использует href = "#" ].

Недостатком этого является то, что вы теряете управление с клавиатуры, так как вы не можете перейти на span / div / bare-a или активировать его с помощью пробела . Является ли это недостатком на самом деле, зависит от того, какое действие должен выполнять элемент. Вы можете, приложив некоторые усилия, попытаться имитировать взаимодействие с клавиатурой, добавив к элементу tabIndex и прослушивая нажатие клавиши пробела. Но он никогда не сможет на 100% воспроизвести реальное поведение браузера, не в последнюю очередь потому, что разные браузеры могут по-разному реагировать на клавиатуру (не говоря уже о невизуальных браузерах).

Если вам действительно нужен элемент, который не является ссылкой, но который может быть активирован как обычно с помощью мыши или клавиатуры, что вы want - это

422
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

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