загрузить вторую версию jQuery (с использованием нескольких версий) [duplicate]

Обновление методов data.table для объединения наборов данных. Ниже приведены примеры для каждого типа соединения. Существует два метода: один из [.data.table при передаче второй data.table в качестве первого аргумента для подмножества, другой способ - использовать функцию merge, которая отправляется в быстрый метод data.table.

Обновление от 2016-04-01 - и это не шутка в апреле! В версии 1.9.7 версии data.table теперь могут использовать существующий индекс, который значительно сокращает время соединения. Ниже кода и эталона НЕ используются индексы data.table при объединении. Если вы ищете соединение в режиме реального времени, вы должны использовать индексы data.table.

df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2L, 4L, 7L), State = c(rep("Alabama", 2), rep("Ohio", 1))) # one value changed to show full outer join

library(data.table)

dt1 = as.data.table(df1)
dt2 = as.data.table(df2)
setkey(dt1, CustomerId)
setkey(dt2, CustomerId)
# right outer join keyed data.tables
dt1[dt2]

setkey(dt1, NULL)
setkey(dt2, NULL)
# right outer join unkeyed data.tables - use `on` argument
dt1[dt2, on = "CustomerId"]

# left outer join - swap dt1 with dt2
dt2[dt1, on = "CustomerId"]

# inner join - use `nomatch` argument
dt1[dt2, nomatch=0L, on = "CustomerId"]

# anti join - use `!` operator
dt1[!dt2, on = "CustomerId"]

# inner join
merge(dt1, dt2, by = "CustomerId")

# full outer join
merge(dt1, dt2, by = "CustomerId", all = TRUE)

# see ?merge.data.table arguments for other cases

Ниже контрольных баз тестов R, sqldf, dplyr и data.table. Бенчмарк тестирует неблокированные / неиндексированные наборы данных. Вы можете получить еще лучшую производительность, если используете свои ключи data.tables или индексы с sqldf. Base R и dplyr не имеют индексов или ключей, поэтому я не включил этот сценарий в эталон. Бенчмаркинг выполняется по наборам массивов 5M-1, в столбце соединения есть 5M-2 общих значения, поэтому каждый сценарий (слева, справа, полный, внутренний) может быть протестирован, а объединение все еще не является тривиальным для выполнения.

library(microbenchmark)
library(sqldf)
library(dplyr)
library(data.table)

n = 5e6
set.seed(123)
df1 = data.frame(x=sample(n,n-1L), y1=rnorm(n-1L))
df2 = data.frame(x=sample(n,n-1L), y2=rnorm(n-1L))
dt1 = as.data.table(df1)
dt2 = as.data.table(df2)

# inner join
microbenchmark(times = 10L,
               base = merge(df1, df2, by = "x"),
               sqldf = sqldf("SELECT * FROM df1 INNER JOIN df2 ON df1.x = df2.x"),
               dplyr = inner_join(df1, df2, by = "x"),
               data.table = dt1[dt2, nomatch = 0L, on = "x"])
#Unit: milliseconds
#       expr        min         lq      mean     median        uq       max neval
#       base 15546.0097 16083.4915 16687.117 16539.0148 17388.290 18513.216    10
#      sqldf 44392.6685 44709.7128 45096.401 45067.7461 45504.376 45563.472    10
#      dplyr  4124.0068  4248.7758  4281.122  4272.3619  4342.829  4411.388    10
# data.table   937.2461   946.0227  1053.411   973.0805  1214.300  1281.958    10

# left outer join
microbenchmark(times = 10L,
               base = merge(df1, df2, by = "x", all.x = TRUE),
               sqldf = sqldf("SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.x = df2.x"),
               dplyr = left_join(df1, df2, by = c("x"="x")),
               data.table = dt2[dt1, on = "x"])
#Unit: milliseconds
#       expr       min         lq       mean     median         uq       max neval
#       base 16140.791 17107.7366 17441.9538 17414.6263 17821.9035 19453.034    10
#      sqldf 43656.633 44141.9186 44777.1872 44498.7191 45288.7406 47108.900    10
#      dplyr  4062.153  4352.8021  4780.3221  4409.1186  4450.9301  8385.050    10
# data.table   823.218   823.5557   901.0383   837.9206   883.3292  1277.239    10

# right outer join
microbenchmark(times = 10L,
               base = merge(df1, df2, by = "x", all.y = TRUE),
               sqldf = sqldf("SELECT * FROM df2 LEFT OUTER JOIN df1 ON df2.x = df1.x"),
               dplyr = right_join(df1, df2, by = "x"),
               data.table = dt1[dt2, on = "x"])
#Unit: milliseconds
#       expr        min         lq       mean     median        uq       max neval
#       base 15821.3351 15954.9927 16347.3093 16044.3500 16621.887 17604.794    10
#      sqldf 43635.5308 43761.3532 43984.3682 43969.0081 44044.461 44499.891    10
#      dplyr  3936.0329  4028.1239  4102.4167  4045.0854  4219.958  4307.350    10
# data.table   820.8535   835.9101   918.5243   887.0207  1005.721  1068.919    10

# full outer join
microbenchmark(times = 10L,
               base = merge(df1, df2, by = "x", all = TRUE),
               #sqldf = sqldf("SELECT * FROM df1 FULL OUTER JOIN df2 ON df1.x = df2.x"), # not supported
               dplyr = full_join(df1, df2, by = "x"),
               data.table = merge(dt1, dt2, by = "x", all = TRUE))
#Unit: seconds
#       expr       min        lq      mean    median        uq       max neval
#       base 16.176423 16.908908 17.485457 17.364857 18.271790 18.626762    10
#      dplyr  7.610498  7.666426  7.745850  7.710638  7.832125  7.951426    10
# data.table  2.052590  2.130317  2.352626  2.208913  2.470721  2.951948    10
374
задан Tshepang 20 April 2014 в 11:10
поделиться

7 ответов

Да, это выполнимо из-за режима noconflict jQuery. http://blog.nemikor.com/2009/10/03/using-multiple-versions-of-jquery/

<!-- load jQuery 1.1.3 -->
<script type="text/javascript" src="http://example.com/jquery-1.1.3.js"></script>
<script type="text/javascript">
var jQuery_1_1_3 = $.noConflict(true);
</script>

<!-- load jQuery 1.3.2 -->
<script type="text/javascript" src="http://example.com/jquery-1.3.2.js"></script>
<script type="text/javascript">
var jQuery_1_3_2 = $.noConflict(true);
</script>

Затем вместо $('#selector').function(); , вы сделали бы jQuery_1_3_2('#selector').function(); или jQuery_1_1_3('#selector').function();.

510
ответ дан ceejayoz 21 August 2018 в 16:50
поделиться
  • 1
    Большое спасибо, ceejayoz! Это похоже на жизнеспособное решение - единственная потенциальная проблема заключается в том, что я не контролирую первую часть вашего кода (назначая более старую версию jQuery другому псевдониму). Как клиент использует jQuery, будет отличаться и не под моим контролем. Могу ли я просто использовать последнюю половину, или обе библиотеки должны вызывать noConflict ()? – Bungle 14 October 2009 в 16:05
  • 2
    Да, вы должны иметь возможность использовать вторую половину. – ceejayoz 14 October 2009 в 17:24
  • 3
    Это действительно прозрачно для исходной страницы? Если они будут использовать $ или jQuery после этот фрагмент кода, будет ли это ссылаться на их собственную версию jQuery или более новую (возможно, у нее меньше установленных плагинов)? – Wim 18 January 2011 в 00:18
  • 4
    @ceejayoz, что произойдет, если у вас есть функция self-invoking, которая использует в ней много $. Мы должны были бы изменить каждый отдельный $ на jquery_1_3_2, в пределах этого раздела noconflict ??? – klewis 30 April 2013 в 18:38
  • 5
    @blachawk Нет, просто псевдоним. (function($) { /*your code here*/ }(jquery_x_x_x)); – Fabrício Matté 9 May 2013 в 23:58

На вашей странице может быть как можно больше различных версий jQuery.

Используйте jQuery.noConflict() :

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>
<script>
    var $i = jQuery.noConflict();
    alert($i.fn.jquery);
</script> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    var $j = jQuery.noConflict();
    alert($j.fn.jquery);
</script> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
    var $k = jQuery.noConflict();
    alert($k.fn.jquery);
</script> 

DEMO | Источник

19
ответ дан Community 21 August 2018 в 16:50
поделиться

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

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script>var $oldjQuery = $.noConflict(true);</script>

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

Вот пример

$(function(){console.log($.fn.jquery)});
$oldjQuery (function(){console.log($oldjQuery.fn.jquery)})

Демо

4
ответ дан gdmanandamohon 21 August 2018 в 16:50
поделиться

Абсолютно, да, вы можете. Эта ссылка содержит сведения о том, как вы можете это сделать: https://api.jquery.com/jquery.noconflict/ .

1
ответ дан Jaime Montoya 21 August 2018 в 16:50
поделиться

Взято из http://forum.jquery.com/topic/multiple-versions-of-jquery-on-the-same-page :

  • Исходная страница загружает его «jquery.versionX.js» - $ и jQuery принадлежат версииX.
  • Вы вызываете свой «jquery.versionY.js» - теперь $ и jQuery принадлежат версииY, плюс _$ и _jQuery принадлежат версииX.
  • my_jQuery = jQuery.noConflict(true); - теперь $ и jQuery принадлежат версииX, _$ и _jQuery, вероятно, null, а my_jQuery - версияY.
28
ответ дан Matt 21 August 2018 в 16:50
поделиться

Можно загрузить вторую версию jQuery, а затем восстановить исходную версию или сохранить вторую версию, если раньше не было загружено jQuery. Вот пример:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript">
    var jQueryTemp = jQuery.noConflict(true);
    var jQueryOriginal = jQuery || jQueryTemp;
    if (window.jQuery){
        console.log('Original jQuery: ', jQuery.fn.jquery);
        console.log('Second jQuery: ', jQueryTemp.fn.jquery);
    }
    window.jQuery = window.$ = jQueryTemp;
</script>
<script type="text/javascript">
    console.log('Script using second: ', jQuery.fn.jquery);
</script>
<script type="text/javascript">
    // Restore original jQuery:
    window.jQuery = window.$ = jQueryOriginal;
    console.log('Script using original or the only version: ', jQuery.fn.jquery);
</script>
18
ответ дан Tomas Kirda 21 August 2018 в 16:50
поделиться

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

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
    <script>var $j = jQuery.noConflict(true);</script>
    <script>
      $(document).ready(function(){
       console.log($().jquery); // This prints v1.4.2
       console.log($j().jquery); // This prints v1.9.1
      });
   </script>

Итак, добавление «j» после «$» было всем, что мне нужно было сделать.

$j(function () {
        $j('.button-pro').on('click', function () {
            var el = $('#cnt' + this.id.replace('btn', ''));
            $j('#contentnew > div').not(el).animate({
                height: "toggle",
                opacity: "toggle"
            }, 100).hide();
            el.toggle();
        });
    });
69
ответ дан Weird Mike 21 August 2018 в 16:50
поделиться
  • 1
    Просто о сохранении моей кожи в личном проекте, СПАСИБО! – Srihari Yamanoor 28 March 2018 в 06:59
  • 2
    Чтобы избежать переименования переменной jquery во многих местах, вы можете просто заключить свой старый код в следующее: (function($){ })($j) – Marinos An 23 April 2018 в 12:43
Другие вопросы по тегам:

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